#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#define Lson tr[root].lson
#define Rson tr[root].rson
using namespace std;
const int N=1e5,M=3e6;
int n,m,Root[N+5],cntt,ans=1;
struct node{
int lson,rson,sum;
}tr[M+5];
void pushup(int root){
tr[root].sum=max(tr[Lson].sum,tr[Rson].sum);
}
int query(int root,int L,int R,int pl,int pr){
if (!root) return 0;
if (pl<=L&&R<=pr) return tr[root].sum;
int mid=L+R>>1,mx=0;
if (mid>=pl) mx=max(mx,query(Lson,L,mid,pl,pr));
if (mid<pr) mx=max(mx,query(Rson,mid+1,R,pl,pr));
return mx;
}
void update(int &root,int L,int R,int w,int x){
if (!root){root=++cntt;Lson=Rson=0;}
if (L==R){
tr[root].sum+=x;
return;
}
int mid=L+R>>1;
if (w<=mid) update(Lson,L,mid,w,x);
else update(Rson,mid+1,R,w,x);
pushup(root);
}
int main(){
ios::sync_with_stdio(0);
cin>>n>>m;
for (int i=1;i<=m;i++){
int u,v,w; cin>>u>>v>>w;
update(Root[v],0,N,w,query(Root[u],0,N,0,w-1)+1);
ans=max(ans,tr[Root[v]].sum);
}
cout<<ans;
}