#include<cstdio>
#include<cstring>
#include<algorithm>
using std::sort;
using std::max;
using std::min;
const int M=1e5+7,N=3e6+7;
int read(){
int ans=0,f=1,c=getchar();
while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
return ans*f;
}
int cnt,n,m,lx[M],rx[M],mn[N],sign[N],ll[M],rr[M];
struct pos{int l,r,v;}q[M],s[M];
bool cmp(pos a,pos b){return a.v>b.v;}
void clear(){
cnt=1;
memset(mn,0,sizeof(mn));
memset(sign,0,sizeof(sign));
}
int L,R;
void up(int x){mn[x]=min(mn[x<<1],mn[x<<1^1]);}
void down(int x){
if(!sign[x]) return ;
int ls=x<<1,rs=x<<1^1;
sign[x]=0; sign[ls]=sign[rs]=1;
mn[ls]=mn[rs]=1;
}
void modify(int x,int l,int r){
if(L<=l&&r<=R){
mn[x]=1; sign[x]=1;
return ;
}
down(x);
int mid=(l+r)>>1;
if(L<=mid) modify(x<<1,l,mid);
if(R>mid) modify(x<<1^1,mid+1,r);
up(x);
}
int push_mn(int x,int l,int r){
if(L<=l&&r<=R) return mn[x];
down(x);
int mid=(l+r)>>1,ans=1;
if(L<=mid) ans=min(ans,push_mn(x<<1,l,mid));
if(R>mid) ans=min(ans,push_mn(x<<1^1,mid+1,r));
return ans;
}
bool check(int k){
if(!k) return 1;
clear();
for(int i=1;i<=k;i++) s[i]=q[i];
sort(s+1,s+1+k,cmp);
int color=s[1].v;
lx[1]=s[1].l; rx[1]=s[1].r;
ll[1]=lx[cnt],rr[1]=rx[cnt];
for(int i=2;i<=k;i++){
if(s[i].v!=color){
cnt++; color=s[i].v;
lx[cnt]=s[i].l; rx[cnt]=s[i].r;
ll[cnt]=lx[cnt]; rr[cnt]=rx[cnt];
}
else lx[cnt]=min(lx[cnt],s[i].l),rx[cnt]=max(rx[cnt],s[i].r),ll[cnt]=max(ll[cnt],s[i].l),rr[cnt]=min(rr[cnt],s[i].r);
if(ll[cnt]>rr[cnt]) return 1;
}
for(int i=1;i<=cnt;i++){
L=ll[i]; R=rr[i];
if(push_mn(1,1,n)!=0) return 1;
L=lx[i]; R=rx[i];
modify(1,1,n);
}
return 0;
}
int main(){
n=read(); m=read();
for(int i=1;i<=m;i++) q[i].l=read(),q[i].r=read(),q[i].v=read();
int l=1,r=m+1;
while(l<r){
int mid=(l+r)>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
if(r>m) printf("0\n");
else printf("%d\n",r);
return 0;
}