#include <bits/stdc++.h>
#define ls o<<1
#define rs o<<1|1
using namespace std;
int n , f[2000005] , a[500001] , v[2000005] , m;
inline void push_up (int o)
{
f[o] = f[ls] + f[rs];
}
void build_tree (int o , int l , int r)
{
if (l == r)
{
f[o] = a[l];
return;
}
int mid = (l + r) >> 1;
build_tree (ls , l , mid);
build_tree (rs , mid + 1 , r);
push_up (o);
}
void push_down (int o , int l , int r)
{
if (l == r)
{
v[o] = 0;
return;
}
int mid = (l + r) >> 1;
f[ls] += (mid - l + 1) * v[o];
f[rs] += (r - mid) * v[o];
v[ls] += v[o];
v[rs] += v[o];
v[o] = 0;
push_up (o);
}
void add (int o , int l , int r , int s , int t , int p)
{
if (l == s && r == t)
{
f[o] += (t - s + 1) * p;
v[o] += p;
return ;
}
int mid = (l + r) >> 1;
if (mid >= t)
add (ls , l , mid , s , t , p);
else if (mid < s)
add (rs , mid + 1 , r , s , t , p);
else
add (ls , l , mid , s , mid , p) , add (rs , mid + 1 , r , mid + 1 , t , p);
push_up (o);
}
int find (int o , int l , int r , int x)
{
if (v[o])
{
push_down (o , l , r);
}
if (l == r)
{
return f[o];
}
int mid = (l + r) >> 1;
if (x == mid)
return f[mid];
else if (x > mid)
return find (ls , l , mid , x);
else
return find (rs , mid + 1 , r , x);
}
signed main (void)
{
ios::sync_with_stdio (false);
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> a[i];
build_tree (1 , 1 , n);
for (int i = 1; i <= m; i++)
{
int d , s , t;
cin >> d >> s >> t;
add (1 , 1 , n , s , t , -d);
if (find (1 , 1 , n , 1) < 0)
{
cout << -1 << "\n" << i;
return 0;
}
}
cout << 0;
return 0;
}