WA:#1#2#3 TLE:#4#5#6#7#8#9#10
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y;
}arr[500000];
int n,m,ans=0;
int ind[5007]={0};//赛博目录
bool bx[5007];//最佳消费者
bool bc[5007];//最佳生产者
bool vis[5007];
bool cmp(node a,node b){
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
int dfs(int d,int len){
len++;
int maxlen=0;
if(!bc[d])return len;//如果生物是最佳生产者(即没有消费来源)返回长度
for(int i=ind[d];i<ind[d+1];i++){
if(!vis[arr[i].y]){//如果没搜过
vis[d]=1;//标记搜过
maxlen=max(maxlen,dfs(arr[i].y,len));
vis[d]=0;//回溯
}
}
return maxlen;
}
int main(){
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>arr[i].x>>arr[i].y;
bx[arr[i].y]=1;//最佳消费者排除
bc[arr[i].x]=1;//最佳生产者排除
ind[arr[i].x+1]++;
}//输入
for(int i=2;i<=n;i++){
ind[i]+=ind[i-1];
//cout<<ind[i]<<' ';
}//cout<<endl;
sort(arr,arr+m,cmp);
/*调试
for(int i=0;i<m;i++)cout<<arr[i].x<<' '<<arr[i].y<<' ';
cout<<endl;*/
for(int i=1;i<=n;i++){
//cout<<bx[i]<<bc[i]<<' ';
if(!bx[i]){//如果生物是最佳消费者
int l=dfs(i,0);
//cout<<l;
ans=max(ans,l);
}//cout<<endl;
}cout<<ans;
}