#include<bits/stdc++.h>
using namespace std;
const int M=1e6+5;
vector<int> v[M];
int ind[M]; int dp[M];
int n,m;
void topo(){
queue<int> q;
for(int i=1;i<=n;i++){
if(!ind[i]) q.push(i);
}
while(!q.empty()){
int x=q.front(); q.pop();
for(int i=0;i<v[x].size();i++){
int p=v[x][i];
dp[p]=max(dp[p],dp[x]+1);
ind[p]--;
if(!ind[p]) q.push(p);
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,l; cin>>u>>l;
v[u].push_back(l);
ind[l]++;
}
topo();
int maxn=0;
for(int i=1;i<=n;i++){
maxn=max(maxn,dp[i]);
}
cout<<maxn<<'\n';
return 0;
}