#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;
}