//######################################## LET'S DO THIS #########################################################//
/* 
Name: Prathamesh S
Motto: To Never Give Up
Linkedin: https://www.linkedin.com/in/prathamesh-shendarkar-1a3411172/
*/

//####################################### Start of Macros ########################################################//
#include <bits/stdc++.h>
//######################################### Containers ###########################################################//
#define all(v) v.begin(),v.end()
#define mem(n,m) memset(n,m,sizeof(n))
#define pii pair<int,int>
#define pll pair<long long,long long>
#define sii set<int>
#define sll set<long long>
#define vii vector<int> 
#define vll vector<long long>
#define mll map<long long, long long>
#define ff first
#define ss second
#define pb push_back
#define pf push_front
#define ins insert
#define mp make_pair
#define len(s) s.length()
//########################################### Loops ##############################################################//
#define loopa(i,a,b) for(i=a;i<=b;i++)
#define loop(i,n) for(i=0;i<n;i++)
#define pool(i,n) for(i=n-1;i>=0;i--)
#define poop(i,a,b) for(i=a;i>=b;i--)
//########################################## Debugging ###########################################################//
#define on cout<<endl
#define o2(a,b) cout<<a<<" "<<b
#define debug(a) cout<<a<<"\n";
#define os cout<<" "
//########################################## Ends/Bounds #########################################################//
#define lob lower_bound
#define upb upper_bound
#define ret return 0
//########################################## Containers ##########################################################//
#define present(s,x) (s.find(x) != s.end()) 
#define cpresent(s,x) (find(all(s),x) != s.end()) 
#define ford(container, it) for(__typeof(container.begin()) it = container.begin(); it != container.end(); it++) 
#define fors(container, it, a, b) for(__typeof(container.begin()) it = a; it != b; it++) 
//############################################# Size #############################################################//
#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define mod 1000000007
#define EPSILON 1e-9
#define PI 3.14159265358979323846
#define inf 999999999999999999
#define siz 100001
#define SIZ 1000001
#define SIZE 200001
//############################################ typedefs #########################################################//
typedef long long  ll;
typedef long double ldo;
typedef double db;
//########################################## End of Macros ######################################################//
using namespace std;

//######################################### Start of Program ####################################################//
template<class T>
T NEGMOD(T x){   return (x%mod +mod)%mod;}

vector<ll> v[siz];
ll n,e;
bool visited[siz];
vector<ll> dp(siz);
vector<ll> incoming(siz, 0);

void dfs(ll i){
	assert(!visited[i]); // Check if visited
	visited[i] = true;
	for(int b: v[i]){
		dp[b] = max(dp[b], dp[i] + 1);
		incoming[b]--;
		if(incoming[b] == 0){
			dfs(b);
		}
	}
}

int main(){
	fastio
	
	cin >> n >> e;
	for(ll i = 0;i<e;i++){
		ll x,y;
		cin >> x >> y;
		v[x].push_back(y);
		++incoming[y];
	}
	
	for(ll i = 1;i<=n;i++){
		if(!visited[i] && incoming[i] == 0){
			dfs(i);
		}
	}
	
	ll ans = 0;
	for(ll i = 1;i<=n;i++){
		ans = max(ans, dp[i]);
	}
	
	cout << ans << "\n";
}





/*

*/
//######################################### End of Program ######################################################//

Measured memory_bytes: 10496