#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
typedef long long ll;
#define int long long
int n,m,R;
int jie[1000005];
struct did{
int d,s,t;
}a[1000005];
struct tree{
int lz,sum,l,r;
}tr[1000005*4];
inline void pushup(int p)
{
tr[p].sum=min(tr[p<<1].sum,tr[p<<1|1].sum);
}
inline void build(int p,int l,int r)
{
tr[p].l=l;tr[p].r=r;
if(l==r)
{
cin>>R;
tr[p].sum=R;
return ;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
pushup(p);
}
inline void pushdown(int p)
{
if(!tr[p].lz)return ;
tr[p<<1].sum-=tr[p].lz;
tr[p<<1|1].sum-=tr[p].lz;
tr[p<<1].lz+=tr[p].lz;
tr[p<<1|1].lz+=tr[p].lz;
tr[p].lz=0;
}
inline void modify(int p,int l,int r,int add)
{
if(l<=tr[p].l&&tr[p].r<=r)
{
tr[p].sum-=add;
tr[p].lz+=add;
return ;
}
pushdown(p);
int mid=(tr[p].l+tr[p].r)>>1;
if(l<=mid)modify(p<<1,l,r,add);
if(r>mid)modify(p<<1|1,l,r,add);
pushup(p);
}
inline int query(int p,int l,int r)
{
if(l<=tr[p].l&&tr[p].r<=r)return tr[p].sum;
pushdown(p);
int mid=(tr[p].l+tr[p].r)>>1;
int minn=123456789;
if(l<=mid)minn=min(minn,query(p<<1,l,r));
if(r>mid)minn=min(minn,query(p<<1|1,l,r));
return minn;
}
signed main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
build(1,1,n);
for(int i=1;i<=m;i++)
{
cin>>a[i].d>>a[i].s>>a[i].t;
/*for(int j=a[i].s;j<=a[i].t;j++)//SEGMENT TREE?
{
jie[j]+=a[i].d;
if(jie[j]>r[j])
{
cout<<-1<<endl;
cout<<i<<endl;
return 0;
}
}*/
if(query(1,a[i].s,a[i].t)<a[i].d)
{
cout<<-1<<endl;
cout<<i<<endl;
return 0;
}
modify(1,a[i].s,a[i].t,a[i].d);
}
cout<<0<<endl;
return 0;
}