#include<bits/stdc++.h>
using namespace std;

vector<int> graph[100001];
bool vis[100001];
int dp[100001];
void dfs(int u)
{
	dp[u]=0;
	vis[u]=1;
	for(auto v:graph[u])
	{
		if(!vis[v])
		{
			dfs(v);
		}
		dp[u]=max(dp[u],dp[v]+1);
	}
}	

int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=0;i<m;i++)
	{
		int x,y;
		cin>>x>>y;
		graph[x].push_back(y);
	}
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;i++)
	{
		if(!vis[i])
			dfs(i);
	}
	cout<<*max_element(dp+1,dp+n+1);
	return 0;
}
