#include <iostream>
#include <bits/stdc++.h>
#define ll long long
using namespace std;
template <typename type>
inline void read(type& x){
bool f = 0; x = 0; char c = getchar();
while(c < '0' || c > '9'){f = c == '-'; c = getchar();}
while(c >= '0' && c <= '9'){x = (x << 3) + (x << 1) + (c ^ 48); c = getchar();}
if(f) x = -x;
}
const int maxN = 1000005;
int rooms[maxN], tree[4 * maxN], lazy[4 * maxN];
void buildTree(int l, int r, int p){
if(l == r){
tree[p] = rooms[l];
return ;
}
int m = (r - l) / 2 + l;
buildTree(l, m, 2 * p);
buildTree(m + 1, r, 2 * p + 1);
tree[p] = min(tree[2 * p], tree[2 * p + 1]);
}
void down(int p){
lazy[2 * p] += lazy[p];
lazy[2 * p + 1] += lazy[p];
tree[2 * p] -= lazy[p];
tree[2 * p + 1] -= lazy[p];
lazy[p] = 0;
}
void updata(int l, int r, int s, int t, int p, int c){
if(r >= t && l <= s){
lazy[p] += c;
tree[p] -= c;
return ;
}
if(lazy[p]){
down(p);
}
int m = (t - s) / 2 + s;
if(m >= l){
updata(l, r, s, m, 2 * p, c);
}
if(m < r){
updata(l, r, s, m, 2 * p + 1, c);
}
tree[p] = min(tree[2 * p], tree[2 * p + 1]);
}
int query(int l, int r, int s, int t, int p){
if(r >= t && l <= s){
return tree[p];
}
if(lazy[p]){
down(p);
}
int m = (t - s) / 2 + s;
int res = INT32_MAX;
if(m >= l){
res = min(query(l, r, s, m, 2 * p), res);
}
if(m < r){
res = min(query(l, r, m + 1, r, 2 * p + 1), res);
}
return res;
}
int main(){
int n, m;
read(n), read(m);
for(int i = 1; i <= n; i++){
read(rooms[i]);
}
memset(lazy, 0, sizeof(lazy));
buildTree(1, n, 1);
for(int i = 1; i <= m; i++){
int k, l, r;
read(k), read(l), read(r);
if(query(l, r, 1, n, 1) < k){
printf("-1\n");
printf("%d", i);
break;
}
updata(l, r, 1, n, 1, k);
if(i == m){
printf("0");
}
}
return 0;
}