#include<bits/stdc++.h>
using namespace std ;
#define pii pair<int,int>
const int Max = 25500 ;
const int MAX = 1e6+50 ;
inline int read() {
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=x*10+c-48;c=getchar();}
return x*f;
}
struct Ques {
int l , r , lim ;
} awa[Max] , mem[Max] ;
inline bool com(Ques a,Ques b) { return a.lim > b.lim ; }
int t[MAX] ;
bool p[MAX] ;
bool tree_check(int l,int r) {
for(int i=l;i<=r;i++)
if(!p[i]) return true ;
return false ;
}
void tree_fill(int l,int r) {
for(int i=l;i<=r;i++) p[i] = true ;
}
bool check(int n) {
memset(p,0,sizeof(p)) ;
for(int i=1;i<=n;i++) awa[i] = mem[i] ;
sort(awa+1,awa+n+1,com) ;
int tl , tr , tlm , trm ; bool p = true ;
for(int i=1;i<=n;i++) {
int l = awa[i].l , r = awa[i].r ;
if(p) tl = l , tr = r , tlm = l , trm = r ;
else {
if(r<tlm||l>trm) return false ;
tl = min(l,tr) ; tr = max(r,tr) ;
tlm = max(l,tlm) ; trm = min(r,trm) ;
}
if(i!=n&&awa[i].lim==awa[i+1].lim) p = false ;
else {
p = true ;
if(!tree_check(tlm,trm)) return false ;
tree_fill(tl,tr) ;
}
}
return true ;
}
int main()
{
int n = read() , q = read() ;
for(int i=1;i<=q;i++) {
awa[i].l = read() ;
awa[i].r = read() ;
awa[i].lim = read() ;
mem[i] = awa[i] ;
}
int l = 1 , r = q , ans = 0 ;
while(l<=r) {
int mid = (l+r)>>1 ;
if(!check(mid)) ans = mid , r = mid-1 ;
else l = mid+1 ;
}
cout << ans << endl ;
}