#include<bits/stdc++.h>
using namespace std;
const int maxn=1000010;
int R[maxn];
int n,m,d,S,T;
inline int read()
{
int x=0; char c=getchar();
while(c<'0' || c>'9') c=getchar();
while(c>='0' && c<='9')
x=(x<<1)+(x<<3)+c-'0',c=getchar();
return x;
}
struct tree
{
int l,r,Min,lazy;
}t[maxn<<2];
inline void push_up(int num)
{
t[num].Min=min(t[num<<1].Min,t[num<<1|1].Min);
}
inline void push_down(int num)
{
t[num<<1].lazy+=t[num].lazy;
t[num<<1].Min+=t[num].lazy;
t[num<<1|1].lazy+=t[num].lazy;
t[num<<1|1].Min+=t[num].lazy;
t[num].lazy=0;
}
void build(int l,int r,int num)
{
t[num].l=l,t[num].r=r;
if(l==r)
{
t[num].Min=R[l];
return;
}
int mid=(l+r)>>1;
build(l,mid,num<<1);
build(mid+1,r,num<<1|1);
push_up(num);
}
void update(int l,int r,int ch,int num)
{
if(l<=t[num].l && t[num].r<=r)
{
t[num].lazy+=ch;
t[num].Min+=ch;
return;
}
if(t[num].lazy) push_down(num);
if(l<=t[num<<1].r) update(l,r,ch,num<<1);
if(r>=t[num<<1|1].l) update(l,r,ch,num<<1|1);
push_up(num);
}
int Query(int l,int r,int num)
{
if(l<=t[num].l && t[num].r<=r) return t[num].Min;
if(t[num].lazy) push_down(num);
int ans=INT_MAX;
if(l<=t[num<<1].r) ans=min(ans,Query(l,r,num<<1));
if(r>=t[num<<1|1].l) ans=min(ans,Query(l,r,num<<1|1));
return ans;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++) R[i]=read();
build(1,n,1);
for(int i=1;i<=m;i++)
{
d=read(),S=read(),T=read();
if(Query(S,T,1)-d<0)
{
printf("-1\n%d\n",i);
return 0;
}
update(S,T,-d,1);
}
printf("0\n");
return 0;
}