#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N =1000010;
int w[N]; //第i天可供w[i]个教室租借
int d[N],s[N],t[N];
//d[]:第i个订单需要租借d[i]个教室
//s[]:第i个订单需要从第s[i]天开始借
//t[]:第i个订单需要从第s[i]天借到第t[i]天
LL b[N],a[N]; //第i天需要租借a[i]个教室,b[]是a[]的差分数组,b[]可以通过求前缀和得到a[]
//对比a[i]跟w[i]大小可知是否满足
int n,m;
bool check(int mid)
{
memset(b,0,sizeof b); //b[]初始化为0数组
//用差分求a[](插值)
for(int i = 1; i <= mid; i++)
{
b[s[i]] += d[i];
b[t[i] + 1] -= d[i];
}
memset(a,0,sizeof b);
for(int i = 1; i <= n; i++)
{
a[i] = a[i-1] + b[i];
if(a[i] > w[i]) return false; //所需课室数大于可供课室数
}
return true;
}
int main()
{
cin >> n >> m; //n表示天数,m表示订单数量
for(int i = 1; i <= n; i++) cin >> w[i];
for(int i = 1; i <= m; i++) cin >> d[i] >> s[i] >> t[i];
//对d[]用二分法求最后一个能满足要求的订单
int l = 0, r = m;
/*
l=0 没有订单满足,举极端情况,n、m都为1,且这一天都不能满足 正确答案是-1 1,
但若l从1开始,则无法进入while循环,直接输出0;但如果l从0开始,可以将r变为0,输出-1 0+1
*/
while(l < r)
{
int mid = l + r + 1>> 1;
if(check(mid)) l = mid;
else r = mid - 1;
}
if ( r == m) printf("0");
else printf("-1\n%d",r + 1); r+1即第一个不满足的订单
return 0;
}