stablegradients/pie-gem5-pairs huggingface dataset:
// Slower C++ solution:
// Author : Syed Mujtaba

// Seek knowledge from the Cradle to the Grave !!

// https://www.linkedin.com/in/syed-mujtaba-064a5016a 



#include <bits/stdc++.h>

using namespace std;

#define int     long long

#define fast_io ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

#define mod ((int)(1e9 + 7))

vector < int > to[100005];

vector < int > from[100005];

vector < int > roots;

int dp[100005];

int cal(int i)

{

	if(dp[i] != -1)

		return dp[i];

	int dist = -1;

	for(int j = 0; j < to[i].size(); j++)

	{

		dist = max(dist, 1 + cal(to[i][j]));

	}

	return dp[i] = dist;

}

signed main()

{

	fast_io

	int n, m;

	int x, y;

	cin >> n >> m;

	for(int i = 0; i < m; i++)

	{	

		cin >> x >> y;

		to[y].push_back(x);

		from[x].push_back(y);

	}

	for(int i = 1; i <= n; i++)

		dp[i] = -1;

	for(int i = 1; i <= n; i++)

	{

		if(to[i].size() == 0)

		{

			roots.push_back(i);

			dp[i] = 0;

		}

	}

	for(int i = 1; i <= n; i++)

	{

		if(dp[i] == -1)

			dp[i] = cal(i);

	}

	int ans = -1;

	for(int i = 1; i <= n; i++)

	{

		ans = max(ans, dp[i]);

	}

	cout << ans << endl;

}

// Faster C++ solution for the same problem (measured speedup: 1.804392431412887x):
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

typedef pair<ll,ll>pll;

typedef pair<ll,pair<ll,ll>>plll;

#define fastread() (ios_base:: sync_with_stdio(false),cin.tie(NULL));

#define vll(v) v.begin(),v.end()

#define all(x) x.rbegin(),x.rend()

#define min3(a, b, c)   min(a, min(b, c))

#define max3(a, b, c)   max(a, max(b, c))

#define F first

#define S second

#define in  freopen("input.txt", "r", stdin)

#define out  freopen("output.txt", "w", stdout)

#define minheap int,vector<int>,greater<int>

#define pb push_back

#define eb emplace_back

#define ischar(x)  (('a' <= x && x <= 'z') || ('A' <= x && x <= 'Z'))

#define isvowel(ch) ((ch=='a'||ch=='e'||ch=='i'||ch=='o'||ch=='u')||(ch=='A'|| ch=='E' || ch=='I'|| ch=='O'|| ch=='U'))

#define bug cout<<"BUG"<<endl;

const int Max = 1e5 + 10;

const int Mod = 1e9 + 7;

const double PI  =3.141592653589793238463;





ll n,m;



vector<ll>adj[Max+10];



ll indeg[Max+10];



ll dis[Max+10];







void input()

{

      ll i,a,b;





       for(i=1; i<=m; i++)

       {

           cin>>a>>b;



           adj[a].eb(b);



           indeg[b]++;

       }

}



ll topsort()

{

    ll u,mx=0;



       queue<ll>q;



       for(ll i=1; i<=n; i++)

       {

           if(!indeg[i])q.push(i);

       }



         while(!q.empty())

         {

              u=q.front();



              q.pop();



                for(auto v  : adj[u])

                {

                   dis[v]=max(dis[v],dis[u]+1);



                   mx=max(dis[v],mx);



                   indeg[v]--;



                   if(!indeg[v])

                    q.push(v);

                }

         }



         return mx;

}

int main()

{



   fastread();



   ll i,j,p,a,sum=0,k,t,b,c,d,cnt=0,q,l,r;





     string str;



   bool flag=true;



     cin>>n>>m;



     input();





      cout<<topsort()<<endl;















}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

#define ll long long

#define ull unsigned long long

#define PII pair<int,int>

#define PSI pair<string,int>

#define PIII pair< int, pair<int,int> >

const int MaxN = 1e5+5;

vector<int> g[MaxN];

int dp[MaxN];

int N;



int dfs(int node, int pr){



    auto &ret = dp[node];

    if(ret!=-1) return ret;

    ret = 0;

    for(auto i: g[node]){

        if(i==pr) continue;

        ret = max( ret, dfs(i,node)+1 );

    }



    return ret;

}



void read(){



    int i,edge;

    memset(dp,-1,sizeof dp);

    cin>>N>>edge;

    for(i=0; i<edge; i++){

        int u,v;

        cin>>u>>v;

        g[u].push_back(v);

    }

}



void solve(){



    read();

    int res = 0;

    for(int i=1; i<=N; i++){

        res = max( res, dfs(i,0) );

    }



    cout<< res << "\n";

}



int main(){



    //freopen("input.txt","r",stdin);

    ios_base::sync_with_stdio(false);

    cin.tie(nullptr);

    solve();

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.112268849987639x):
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

typedef pair<ll,ll>pll;

typedef pair<ll,pair<ll,ll>>plll;

#define fastread() (ios_base:: sync_with_stdio(false),cin.tie(NULL));

#define vll(v) v.begin(),v.end()

#define all(x) x.rbegin(),x.rend()

#define min3(a, b, c)   min(a, min(b, c))

#define max3(a, b, c)   max(a, max(b, c))

#define F first

#define S second

#define in  freopen("input.txt", "r", stdin)

#define out  freopen("output.txt", "w", stdout)

#define minheap int,vector<int>,greater<int>

#define pb push_back

#define eb emplace_back

#define ischar(x)  (('a' <= x && x <= 'z') || ('A' <= x && x <= 'Z'))

#define isvowel(ch) ((ch=='a'||ch=='e'||ch=='i'||ch=='o'||ch=='u')||(ch=='A'|| ch=='E' || ch=='I'|| ch=='O'|| ch=='U'))

#define bug cout<<"BUG"<<endl;

const int Max = 1e5 + 10;

const int Mod = 1e9 + 7;

const double PI  =3.141592653589793238463;





ll n,m;



vector<ll>adj[Max+10];



ll indeg[Max+10];



ll dis[Max+10];







void input()

{

      ll i,a,b;





       for(i=1; i<=m; i++)

       {

           cin>>a>>b;



           adj[a].eb(b);



           indeg[b]++;

       }

}



ll topsort()

{

    ll u,mx=0;



       queue<ll>q;



       for(ll i=1; i<=n; i++)

       {

           if(!indeg[i])q.push(i);

       }



         while(!q.empty())

         {

              u=q.front();



              q.pop();



                for(auto v  : adj[u])

                {

                   dis[v]=max(dis[v],dis[u]+1);



                   mx=max(dis[v],mx);



                   indeg[v]--;



                   if(!indeg[v])

                    q.push(v);

                }

         }



         return mx;

}

int main()

{



   fastread();



   ll i,j,p,a,sum=0,k,t,b,c,d,cnt=0,q,l,r;





     string str;



   bool flag=true;



     cin>>n>>m;



     input();





      cout<<topsort()<<endl;















}
// Slower C++ solution:
#include<bits/stdc++.h>

#define ll long long

using namespace std;

ll n,m,x,y;

vector<ll>v[100009];

ll dp[100009];



ll f(ll N){

	if (v[N].empty())return 0;

	if(dp[N]!=-1)return dp[N];

	ll z=0;

	for(int i=0; i<v[N].size(); i++){

		z=max(z,f(v[N][i])+1);

	}

	dp[N]=z;

	return dp[N];

}



int main(){

	cin >> n >> m;

	memset(dp,-1,sizeof dp);

	for(int i=1; i<=m; i++){

		cin >> x >> y;

		v[x].push_back(y);

	}

	ll jwb=0;

	for(int i=1; i<=n; i++){

		jwb=max(jwb,f(i));

	}

	cout << jwb << endl;

}//j

// Faster C++ solution for the same problem (measured speedup: 1.228011952230547x):
#include <bits/stdc++.h>

using namespace std;

typedef pair<int,int> pii;

typedef vector<int> vi; 

typedef long long ll;

#define pb push_back

#define fi first

#define se second

#define rep(i,a,b) for(int i=(a);i<=(int)(b);i++)

#define per(i,a,b) for(int i=(a);i>=(int)(b);i--)

const int mod = 1e9+7;

const int maxn = 1e5+10;

const int inf = 0x3f3f3f3f;

vi g[maxn];

queue<int> q;

int dp[maxn],du[maxn];

int main()

{

    ios::sync_with_stdio(false);cin.tie(nullptr);

    //freopen("in1.txt","r",stdin);

    int n,m;

    cin>>n>>m;

    rep(i,1,m) {

        int u,v;

        cin>>u>>v;

        g[u].pb(v);

        du[v]++;

    }

    rep(i,1,n) {

        if(du[i]==0) q.push(i);

    }

    while(!q.empty()) {

        int now=q.front();q.pop();

        for(int x:g[now]) {

            du[x]--;

            if(du[x]==0) q.push(x);

            dp[x]=max(dp[x],dp[now]+1);

        }

    }

    int Max=0;

    rep(i,1,n) {

        Max=max(Max,dp[i]);

    }

    cout<<Max<<'\n';

    return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

#define ll long long

#define ull unsigned long long

#define mst(a, b) memset((a), (b), sizeof(a))

#define mp(a, b) make_pair(a, b)

#define pi acos(-1)

#define pii pair<int, int>

#define pb push_back

const int INF = 0x3f3f3f3f;

const double eps = 1e-10;

const int maxn = 1e5 + 7;

const int maxm = 5e5 + 10;

const int mod = 1e9 + 7;

vector<int> s[maxn];

int vis[maxn];

int dp[maxn];

int main()

{

    ios::sync_with_stdio(0);

    cin.tie(0);

    cout.tie(0);

    mst(vis, 0);

    mst(dp, 0);

    queue<int> q;

    int n, m;

    cin >> n >> m;

    for (int i = 0; i < m; ++i)

    {

        int x, y;

        cin >> x >> y;

        vis[y]++;

        s[x].pb(y);

    }

    for (int i = 1; i <= n; ++i)

    {

        if (!vis[i])

            q.push(i);

    }

    while (!q.empty())

    {

        int now = q.front();

        q.pop();

        int len = s[now].size();

        for (int i = 0; i < len; ++i)

        {

            dp[s[now][i]] = max(dp[s[now][i]], dp[now] + 1);

            vis[s[now][i]]--;

            if (vis[s[now][i]] == 0)

                q.push(s[now][i]);

        }

    }

    int ans = 0;

    for (int i = 1; i <= n; ++i)

        ans = max(ans, dp[i]);

    cout << ans << endl;

    return 0;

}

// Faster C++ solution for the same problem (measured speedup: 1.241419910741229x):
#include <bits/stdc++.h>

using namespace std;

typedef pair<int,int> pii;

typedef vector<int> vi; 

typedef long long ll;

#define pb push_back

#define fi first

#define se second

#define rep(i,a,b) for(int i=(a);i<=(int)(b);i++)

#define per(i,a,b) for(int i=(a);i>=(int)(b);i--)

const int mod = 1e9+7;

const int maxn = 1e5+10;

const int inf = 0x3f3f3f3f;

vi g[maxn];

queue<int> q;

int dp[maxn],du[maxn];

int main()

{

    ios::sync_with_stdio(false);cin.tie(nullptr);

    //freopen("in1.txt","r",stdin);

    int n,m;

    cin>>n>>m;

    rep(i,1,m) {

        int u,v;

        cin>>u>>v;

        g[u].pb(v);

        du[v]++;

    }

    rep(i,1,n) {

        if(du[i]==0) q.push(i);

    }

    while(!q.empty()) {

        int now=q.front();q.pop();

        for(int x:g[now]) {

            du[x]--;

            if(du[x]==0) q.push(x);

            dp[x]=max(dp[x],dp[now]+1);

        }

    }

    int Max=0;

    rep(i,1,n) {

        Max=max(Max,dp[i]);

    }

    cout<<Max<<'\n';

    return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>



using namespace std;



#define el				'\n'

#define sz(v)			((int)((v).size()))

#define all(v)          ((v).begin()),((v).end())

#define clr(v, d)		memset(v, d, sizeof(v))



double const EPS = 1e-8, PI = acos(-1);

const int N = 1e5 + 9, M = 50 + 9, OO = (int) 1e9 + 1;

const long long MOD = 1e9 + 7;



typedef long long ll;



void OUTPUT() {

	cout << fixed << setprecision(12);

	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);

}



void INPUT() {

#ifndef ONLINE_JUDGE

	freopen("input.txt", "r", stdin);

	//freopen("output.txt", "w", stdout);

#endif

	cout << fixed << setprecision(0);

//	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);

}



int n, m, x, y, vis[N], ans;

vector<vector<int>> edges(N);



int DFS(int node) {

	if (vis[node] != -1)

		return vis[node];

	vis[node] = 0;

	for (auto child : edges[node]) {

		DFS(child);

		vis[node] = max(vis[node], vis[child] + 1);

	}

	return 0;

}



int main() {

//	INPUT();

	OUTPUT();

	clr(vis, -1);

	cin >> n >> m;

	for (int i = 0; i < m; ++i) {

		cin >> x >> y;

		edges[x].push_back(y);

	}

	for (int j = 1; j <= n; j++) {

		DFS(j);

	}

	for (int i = 1; i <= n; i++) {

		ans = max(ans, vis[i]);

	}

	cout << ans;



	return 0;



}


// Faster C++ solution for the same problem (measured speedup: 1.1189551180935704x):
#include <bits/stdc++.h>

using namespace std;

typedef pair<int,int> pii;

typedef vector<int> vi; 

typedef long long ll;

#define pb push_back

#define fi first

#define se second

#define rep(i,a,b) for(int i=(a);i<=(int)(b);i++)

#define per(i,a,b) for(int i=(a);i>=(int)(b);i--)

const int mod = 1e9+7;

const int maxn = 1e5+10;

const int inf = 0x3f3f3f3f;

vi g[maxn];

queue<int> q;

int dp[maxn],du[maxn];

int main()

{

    ios::sync_with_stdio(false);cin.tie(nullptr);

    //freopen("in1.txt","r",stdin);

    int n,m;

    cin>>n>>m;

    rep(i,1,m) {

        int u,v;

        cin>>u>>v;

        g[u].pb(v);

        du[v]++;

    }

    rep(i,1,n) {

        if(du[i]==0) q.push(i);

    }

    while(!q.empty()) {

        int now=q.front();q.pop();

        for(int x:g[now]) {

            du[x]--;

            if(du[x]==0) q.push(x);

            dp[x]=max(dp[x],dp[now]+1);

        }

    }

    int Max=0;

    rep(i,1,n) {

        Max=max(Max,dp[i]);

    }

    cout<<Max<<'\n';

    return 0;

}
// Slower C++ solution:
// Author : Syed Mujtaba

// Seek knowledge from the Cradle to the Grave !!

// https://www.linkedin.com/in/syed-mujtaba-064a5016a 



#include <bits/stdc++.h>

using namespace std;

#define int     long long

#define fast_io ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

#define mod ((int)(1e9 + 7))

vector < int > to[100005];

vector < int > from[100005];

vector < int > roots;

int dp[100005];

int cal(int i)

{

	if(dp[i] != -1)

		return dp[i];

	int dist = -1;

	for(int j = 0; j < to[i].size(); j++)

	{

		dist = max(dist, 1 + cal(to[i][j]));

	}

	return dp[i] = dist;

}

signed main()

{

	fast_io

	int n, m;

	int x, y;

	cin >> n >> m;

	for(int i = 0; i < m; i++)

	{	

		cin >> x >> y;

		to[y].push_back(x);

		from[x].push_back(y);

	}

	for(int i = 1; i <= n; i++)

		dp[i] = -1;

	for(int i = 1; i <= n; i++)

	{

		if(to[i].size() == 0)

		{

			roots.push_back(i);

			dp[i] = 0;

		}

	}

	for(int i = 1; i <= n; i++)

	{

		if(dp[i] == -1)

			dp[i] = cal(i);

	}

	int ans = -1;

	for(int i = 1; i <= n; i++)

	{

		ans = max(ans, dp[i]);

	}

	cout << ans << endl;

}

// Faster C++ solution for the same problem (measured speedup: 1.8031844563199702x):
#include <bits/stdc++.h>

using namespace std;

typedef pair<int,int> pii;

typedef vector<int> vi; 

typedef long long ll;

#define pb push_back

#define fi first

#define se second

#define rep(i,a,b) for(int i=(a);i<=(int)(b);i++)

#define per(i,a,b) for(int i=(a);i>=(int)(b);i--)

const int mod = 1e9+7;

const int maxn = 1e5+10;

const int inf = 0x3f3f3f3f;

vi g[maxn];

queue<int> q;

int dp[maxn],du[maxn];

int main()

{

    ios::sync_with_stdio(false);cin.tie(nullptr);

    //freopen("in1.txt","r",stdin);

    int n,m;

    cin>>n>>m;

    rep(i,1,m) {

        int u,v;

        cin>>u>>v;

        g[u].pb(v);

        du[v]++;

    }

    rep(i,1,n) {

        if(du[i]==0) q.push(i);

    }

    while(!q.empty()) {

        int now=q.front();q.pop();

        for(int x:g[now]) {

            du[x]--;

            if(du[x]==0) q.push(x);

            dp[x]=max(dp[x],dp[now]+1);

        }

    }

    int Max=0;

    rep(i,1,n) {

        Max=max(Max,dp[i]);

    }

    cout<<Max<<'\n';

    return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

#define ll long long

#define ull unsigned long long

#define PII pair<int,int>

#define PSI pair<string,int>

#define PIII pair< int, pair<int,int> >

const int MaxN = 1e5+5;

vector<int> g[MaxN];

int dp[MaxN];

int N;



int dfs(int node, int pr){



    auto &ret = dp[node];

    if(ret!=-1) return ret;

    ret = 0;

    for(auto i: g[node]){

        if(i==pr) continue;

        ret = max( ret, dfs(i,node)+1 );

    }



    return ret;

}



void read(){



    int i,edge;

    memset(dp,-1,sizeof dp);

    cin>>N>>edge;

    for(i=0; i<edge; i++){

        int u,v;

        cin>>u>>v;

        g[u].push_back(v);

    }

}



void solve(){



    read();

    int res = 0;

    for(int i=1; i<=N; i++){

        res = max( res, dfs(i,0) );

    }



    cout<< res << "\n";

}



int main(){



    //freopen("input.txt","r",stdin);

    ios_base::sync_with_stdio(false);

    cin.tie(nullptr);

    solve();

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.1115242264545195x):
#include <bits/stdc++.h>

using namespace std;

typedef pair<int,int> pii;

typedef vector<int> vi; 

typedef long long ll;

#define pb push_back

#define fi first

#define se second

#define rep(i,a,b) for(int i=(a);i<=(int)(b);i++)

#define per(i,a,b) for(int i=(a);i>=(int)(b);i--)

const int mod = 1e9+7;

const int maxn = 1e5+10;

const int inf = 0x3f3f3f3f;

vi g[maxn];

queue<int> q;

int dp[maxn],du[maxn];

int main()

{

    ios::sync_with_stdio(false);cin.tie(nullptr);

    //freopen("in1.txt","r",stdin);

    int n,m;

    cin>>n>>m;

    rep(i,1,m) {

        int u,v;

        cin>>u>>v;

        g[u].pb(v);

        du[v]++;

    }

    rep(i,1,n) {

        if(du[i]==0) q.push(i);

    }

    while(!q.empty()) {

        int now=q.front();q.pop();

        for(int x:g[now]) {

            du[x]--;

            if(du[x]==0) q.push(x);

            dp[x]=max(dp[x],dp[now]+1);

        }

    }

    int Max=0;

    rep(i,1,n) {

        Max=max(Max,dp[i]);

    }

    cout<<Max<<'\n';

    return 0;

}
// Slower C++ solution:
#include<iostream>

#include<iomanip>

#include<cmath>

#include<string>

#include<cctype>

#include<algorithm>

#include<set>

#include<map>

#include<stack>

#include<queue>

#include<cstring>

//#include<windows.h>

//#include<time.h>

#define pb push_back

#define ppb pop_back

#define fi first

#define se second

#define mer make_pair

#define mme memset

using namespace std;



const double pie1=3.1415926;//π1

const double pie2=3.14159265358979;//π2

const double pie3=3.14159265358979323846;//π3

const int vbi=999999999;

const int vli=-vbi;

const long long vbl=999999999999999999;

const long long vll=-vbl;



typedef long long ll;

typedef pair<int,int> pii;

typedef pair<ll,ll> pll;

typedef pair<pii,int> piii;

typedef pair<pii,pii> pi4;

typedef pair<pll,ll> plll;

typedef pair<int,pii> ipii;

typedef pair<ll,pll> lpll;

typedef pair<pll,pll> pl4;

typedef vector<int> vi;

typedef vector<ll> vl;

typedef vector<pii> vpi;

typedef vector<pll> vpl;

typedef set<int> sti;

typedef set<ll> stl;

typedef set<pii> spi;

typedef set<pll> spl;

priority_queue<int> pqi;

priority_queue<ll> pql;

queue<int> qi;

queue<ll> ql;



/*void bin_v(){

	char bin[1000];

	gets(bin);

}*/



bool pss(int a){

	for(int i=2;i<=sqrt(a);i++)

		if(a%i==0)

			return false;

	return true;

}

/////////////////////////////////////////////////////////////////////////////////////////

int n,m;

vector<int> v[100010];

int d[100010];

int dp[100010];



int main(){

	//my name is Veex_WCY

	ios::sync_with_stdio(false);

	cin>>n>>m;

	for(int i=1;i<=m;i++){

		int a,b;

		cin>>a>>b;

		v[a].pb(b);

		d[b]++;

	}

	stack<int> st;

	for(int i=1;i<=n;i++)

		if(d[i]==0)

			st.push(i);

	while(!st.empty()){

		int x=st.top();

		st.pop();

		for(int i=0;i<v[x].size();i++){

			int ne=v[x][i];

			if(dp[x]+1>dp[ne])

				dp[ne]=dp[x]+1;

			d[ne]--;

			if(d[ne]==0)

				st.push(ne);

		}

	}

	int maxn=0;

	for(int i=1;i<=n;i++)

		maxn=max(maxn,dp[i]);

	cout<<maxn;

	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 2.555874862363813x):
#include <iostream>

#include <stdio.h>

#include <vector>

#include <cstring>

using namespace std;

int n,m;

const int N=1e5+9;

int memo[N];

vector <vector<int> >graph;

int dp(int i)

{

    if(graph[i].empty())

        return 0;

    int &ret=memo[i];

    if(~ret)

        return ret;



    for(int u:graph[i])

    {

        ret=max(ret,dp(u)+1);

    }

    return ret;

}

int main()

{

    memset(memo,-1,sizeof memo);



    scanf("%d %d",&n,&m);

    graph.resize(n+1);

    while(m--)

    {

        int u,v;

        scanf("%d %d",&u,&v);

        graph[u].push_back(v);

    }

    int ans=0;

    for(int i=1;i<=n;++i)

        ans=max(dp(i),ans);

    printf("%d\n",ans);



    return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>

#define ll long long

using namespace std;

ll n,m,x,y;

vector<ll>v[100009];

ll dp[100009];



ll f(ll N){

	if (v[N].empty())return 0;

	if(dp[N]!=-1)return dp[N];

	ll z=0;

	for(int i=0; i<v[N].size(); i++){

		z=max(z,f(v[N][i])+1);

	}

	dp[N]=z;

	return dp[N];

}



int main(){

	cin >> n >> m;

	memset(dp,-1,sizeof dp);

	for(int i=1; i<=m; i++){

		cin >> x >> y;

		v[x].push_back(y);

	}

	ll jwb=0;

	for(int i=1; i<=n; i++){

		jwb=max(jwb,f(i));

	}

	cout << jwb << endl;

}//j

// Faster C++ solution for the same problem (measured speedup: 3.140551060434571x):
#include <iostream>

#include <stdio.h>

#include <vector>

#include <cstring>

using namespace std;

int n,m;

const int N=1e5+9;

int memo[N];

vector <vector<int> >graph;

int dp(int i)

{

    if(graph[i].empty())

        return 0;

    int &ret=memo[i];

    if(~ret)

        return ret;



    for(int u:graph[i])

    {

        ret=max(ret,dp(u)+1);

    }

    return ret;

}

int main()

{

    memset(memo,-1,sizeof memo);



    scanf("%d %d",&n,&m);

    graph.resize(n+1);

    while(m--)

    {

        int u,v;

        scanf("%d %d",&u,&v);

        graph[u].push_back(v);

    }

    int ans=0;

    for(int i=1;i<=n;++i)

        ans=max(dp(i),ans);

    printf("%d\n",ans);



    return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>



using namespace std;



#define ll long long int



int memo[(int)1e5 + 1];

vector<int> adj[(int)1e5 + 1];



bool vis[(int)1e5 + 1];



int dfs(int x) {

	

	if(vis[x])return memo[x];



	vis[x] = true;

	

	int temp = 1;



	for(int i = 0; i < adj[x].size(); i++) {

		memo[x] = max(memo[x], temp + dfs(adj[x][i]));

	}



	return memo[x];

}



int main() {



	ios_base::sync_with_stdio(0);

	cin.tie(0);

	

	int n,m; cin >> n >> m;

	int s,t;

	

	while(m--) {

		cin >> s >> t;

		adj[s].push_back(t);

	}



	for(int i = 1; i <= n; i++) {

		dfs(i);

	}



	int ans = 0;

	

	for(int i = 1; i <= n; i++) {

		ans = max(ans,memo[i]);

	}



	cout << ans << '\n';



	return 0;

}

// Faster C++ solution for the same problem (measured speedup: 2.551382663160925x):
#include <iostream>

#include <stdio.h>

#include <vector>

#include <cstring>

using namespace std;

int n,m;

const int N=1e5+9;

int memo[N];

vector <vector<int> >graph;

int dp(int i)

{

    if(graph[i].empty())

        return 0;

    int &ret=memo[i];

    if(~ret)

        return ret;



    for(int u:graph[i])

    {

        ret=max(ret,dp(u)+1);

    }

    return ret;

}

int main()

{

    memset(memo,-1,sizeof memo);



    scanf("%d %d",&n,&m);

    graph.resize(n+1);

    while(m--)

    {

        int u,v;

        scanf("%d %d",&u,&v);

        graph[u].push_back(v);

    }

    int ans=0;

    for(int i=1;i<=n;++i)

        ans=max(dp(i),ans);

    printf("%d\n",ans);



    return 0;

}