#include<iostream>
using namespace std;
const int N=1e6;
int b[N],s[N],t[N];
long long a[N],d[N];
int n,m;
int check(int mid){
for(int i=1;i<=mid;i++){
b[s[i]]+=d[i];
b[t[i]+1]-=d[i];
}//完成差分数组
for(int i=1;i<=mid;i++){
a[i]=b[i]+a[i-1];//完成对原序列的赋值
if(a[i]<0){//存在负数说明mid过大
return true;
}
}
return false;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}//记录初始每天的教室
for(int i=1;i<=m;i++){
scanf("%lld%d%d",&d[i],&s[i],&t[i]);//差分初始变量
d[i]=-d[i]; //方便构造差分数组,做减法
}
int l=1,r=m;
while(l<r){
int mid=l+r>>1;
if(check(mid)){
r=mid;//排除后面,答案在前面
}
else l=mid+1;
}//二分答案check函数不会写,凸(艹皿艹 )
if(l==m){
printf("0");
}else{
printf("-1\n%d",r);
}
return 0;
}