#include<iostream>
#include<bits/stdc++.h>
#define int long long 

using namespace std;

const int N=1000000+10;
int n,m;
int a[N],b[N];
int c[N],l[N],r[N];

bool check(int x)
{
    //对每次的订单都是从1开始到x,且内容都可以实现更新 
    for(int i=1;i<=n;i++)
        b[i]=a[i]-a[i-1];//构建a的差分数组
        
    //实现对a数组的特定范围都减去c
    for(int i=1;i<=x;i++)//对第1~x个订单进行操作 
    {  
        b[l[i]]-=c[i];
        b[r[i]+1]+=c[i];
     } 
    for(int i=1;i<=n;i++)
    {
        b[i]+=b[i-1];//将差分数累加,其实是a[i] 
        if(b[i]<0)//如果a[i]<0相当于教室数不足
            return true; 
    }
    return false;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i]; //每天可借的订单数
        
    for(int i=1;i<=m;i++)
     //订单数据 ,这里先导入是为了后面使用差分对订单进行判断 
        cin>>c[i]>>l[i]>>r[i];
    
    //题目是要求找到不符合的订单而且订单具有二段性
    //最快的方法是使用二分进行查找 
    int l=1,r=m+1;//对订单进行遍历  
    while(l<r)
    {
        int mid=(l+r)/2;
        //判断第1~第mid个订单是否符合题意
        //这里是将申请教室小于空闲教室作为答案
        //即左边为所符合的答案,使用模版1 
        if(check(mid)) //当教室不足时为true,r=mid即将该订单舍去,遍历前面的订单 
            r=mid;
        else //当1~mid订单符合时左范围增大,使得查询订单数向后挪 
        //当所有都符合时l==r==m+1 
            l=mid+1; 
     } //结束条件是l==r 
    if(l==m+1)
        cout<<'0'<<endl;
    else
        cout<<r<<endl;
    return 0;
 }