#include<bits/stdc++.h>
#define ll long long int
#define pb push_back
#define pob pop_back
#define vi vector<ll>
#define mp make_pair
#define sz size()
#define rep1(i,n) for(i=1;i<=n;i++)
#define rep(i,n) for(i=0;i<n;i++)
#define fast ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define maxx 1000007
#define edge pair<ll,ll>
#define mod 1000000007
using namespace std;
 
 
// ¦¦¦¦¦¦¦¦¦¦¦¦+++++++++++++++++¦¦¦++++++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦++++++++++++¦¦¦¦¦¦¦¦¦¦+++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦++++++++¦¦¦¦¦+++++++¦++¦¦
// ¦¦¦¦¦¦¦¦++¦¦¦¦¦¦++++++¦¦¦¦+++++++++++++¦
// ¦¦¦¦¦¦¦++++++¦¦¦++++++¦¦++++++++++++++¦¦
// ¦¦¦¦¦¦¦+++++++¦¦¦+++++++++++++++++++++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦++++++¦¦¦¦¦¦¦¦¦++++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++¦¦¦¦¦¦¦¦+++++++¦ 
// ¦¦¦¦¦¦¦¦¦¦++¦¦¦¦¦¦¦+++++++++++++++++++¦¦
// ¦¦¦¦¦¦¦++++¦¦¦¦¦¦¦¦+++++++++++++++++++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++++++++++++++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++++++++++++++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++++++++++++++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++++++++++++++¦¦ 
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦++++++++++++++++++++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦++++++++++++¦¦+¦++¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++¦¦+++++¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+¦¦¦¦+++¦¦¦¦++++++¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++¦¦+¦¦¦¦¦+++++++¦¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++++++¦¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++++++++++++++¦¦¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦++++++++++++++++¦¦¦¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++++++¦¦¦¦¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+¦¦¦+++++++++++¦¦¦¦¦¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++++¦¦¦¦¦¦¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦++++++++¦¦¦¦¦¦¦¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦++++++¦¦¦¦¦¦¦¦¦¦¦¦

//ll dp[maxx];
//ll par[maxx];

//vector<ll>v;
//sqrt(n)
/*
bool isprime(ll n)
{
	if(n==1)
	return false;
	for(ll i=2;i*i<=n;i++)
	{
		if(n%i==0)
		return false;
	}
	return true;
}
*/
////////////////////////////////////////////sieve/////////////////////////////////////////////////////
/*
void sieve()
{
	ll n=1000000;
		ll i;
	ll prime[n+1]={0};	
	ll j;
	prime[1]=1;
	prime[0]=1;
	for(i=2;i*i<=n;i++)
	{
		if(prime[i]==0)
		{
			for(j=2*i;j<=n;j=j+i)
			{
				prime[j]=1;
			}
		}
	}
	ll cnt=0;
	for(i=0;i<=n;i++)
	{
		if(prime[i]==0)
		cnt++;
		
		if(prime[cnt]==0)
		pp[i]=1;
		else
		pp[i]=0;
	}
	for(i=1;i<=n;i++)
	{
		pp[i]+=pp[i-1];
	}

}*/	




//map<ll,ll>f;
//map<pair<ll,ll>,ll>m;


////////////////////////////////////////////////matrix power///////////////////////////////////////////////////
//ll ar[2][2];
//ll I[2][2];

/*
void mul(ll A[][2],ll B[][2],ll m)
{
	ll res[m+1][m+1];
	rep(i,m)
	{
		rep(j,m)
		{
			res[i][j]=0;
			rep(k,m)
			{
				res[i][j]=res[i][j]%mod;
				res[i][j]+=(A[i][k]*B[k][j])%mod;
				res[i][j]=res[i][j]%mod;
			}
			
		}
	}
	rep(i,m)
	{
		rep(j,m)
		{
			A[i][j]=res[i][j];
		}
	}
}

void power(ll a[][2],ll m,ll n)
{
	rep(i,m)rep(j,m)
	{
		if(i==j)
		I[i][j]=1;
		else
		I[i][j]=0;
	}
	
	while(n)
	{
		if(n%2)
		{
			//I=I*a;
			mul(I,a,2);
			n--;	
		}
		else
		{
			//a=a*a;
			mul(a,a,2);
			n/=2;
		}	
	}
	
	rep(i,m)
	{
		rep(j,m)
		{
			a[i][j]=I[i][j];
		}
	}
}*/
/*
void print(ll a[][maxx],ll m)
{
	rep(i,m)
	{
		rep(j,m)
		{
			cout<<(a[i][j])%mod<<" ";
		}
		cout<<endl;
	}
}
*/
vector<ll> g[maxx];
ll vis[maxx];
ll dis[maxx];
ll s;
ll dp[maxx];
void init(ll n)
{
    ll i;
    for(i=0;i<=n;i++)
    {
        dp[i]=-1;
    }
}

ll dfs(ll u)
{
    
    if(dp[u]!=-1)
    return dp[u];
    
    ll res=0;
        for(auto j:g[u])
	    {
		    res=max(res,dfs(j)+1);  
    	}
    
    return dp[u]=res;
}


int main()
{
	fast;
	ll n,m;
	cin>>n>>m;
	ll u,v;
	ll i,j,k;
	rep(i,m)
	{
		cin>>u>>v;
		g[u].pb(v);
	}
	init(n);
	ll res=0;
	for(i=1;i<=n;i++)
	{
		res=max(res,dfs(i));
	}
	cout<<res<<endl;
	return 0;
	
}	
//cout<<"YES"<<endl;

//cout<<"NO"<<endl;

Measured memory_bytes: 30592