//一种解法是线段树,但代码太长。
//我们来看另一种解法。
//每份订单都是将一段区间内的数减少;
//那么随着处理订单数的增加,那么每天的教室的数量必然单调递减。
//即该问题具有单调性。
//故可以二分答案。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1e6+10;
int a0[N],b0[N],b[N];
int n,m,cnt;
pair<int,pair<int,int>> q[N];
bool check(int s[])
{
int sum=0;
for(int i=1;i<=n;i++)
{
sum+=s[i];
if(sum<0)return true;
}
return false;
}
bool valid(int loc)
{
memcpy(b,b0,sizeof b);
for(int i=1;i<=loc;i++)
{
int d=q[i].first;
int l=q[i].second.first,r=q[i].second.second;
b[l]-=d;
b[r+1]+=d;
}
return check(b);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a0[i]);
b0[i]=a0[i]-a0[i-1];
}
for(int i=1;i<=m;i++)
{
int d,l,r;scanf("%d%d%d",&d,&l,&r);
q[++cnt].first=d;
q[cnt].second.first=l;
q[cnt].second.second=r;
}
int l=1,r=m;
while(l<r)
{
int mid=(l+r)>>1;
if(valid(mid))r=mid;//是否有负数
else l=mid+1;
}
if(valid(l)) printf("-1\n%d\n",l);
else printf("0\n");
return 0;
}