stablegradients/pie-gem5-pairs huggingface dataset:
// Slower C++ solution:
#include <bits/stdc++.h>

#define eps 1e-3

#define pi acos(-1.0)

#define inf 0x3f3f3f3f

#define debug1 cout<<"&&";

#define debug2 cout<<"**";

#define pb push_back

#define ms(a, x) memset(a, x, sizeof(a))

#define forn(i, n) for(int i = 0; i < n; ++i)

#define for1(i, n) for(int i = 1; i <= n; ++i) 

typedef double db;

typedef long long ll;

typedef unsigned long long ull;

using namespace std;

const int mod = 1e9;

const int N = 1e5+10;

/*=======================================================================*/



int n, m;

int dp[N], in[N];

vector<int>G[N];

queue<int>q;

int ans = 0;



int main() {

   int a, b;

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

   forn(i, m) {

      scanf("%d%d", &a, &b);

      in[b]++;

      G[a].push_back(b);

   }

   for1(i, n) {

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

   }

   while(!q.empty()) {

      int now = q.front();

      q.pop();

      int sz = G[now].size();

      forn(i, sz) {

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

         in[G[now][i]]--;

         if(in[G[now][i]] == 0) q.push(G[now][i]);

      }

   }

   for1(i, n) {

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

   }

   cout << ans << endl;

}

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

#define si(a) scanf("%d", &a)

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

using namespace std;

typedef long long ll;

typedef pair<int,int> pi;

typedef vector<int> vi;

vector<vector<int> > gr;

vi out;

vi ans;

vector<bool> visited;

vi aux;

void dfs(int u){

	visited[u] = true;

	//ans[u] = max(ans[u], val);

	fore(j,0,gr[u].size()){

		if(!visited[ gr[u][j] ])

			dfs(gr[u][j]);

		//ans[u] = max(ans[u], ans[ gr[u][j] ] + 1);

	}

	aux.push_back(u);

}

void solve(){

	int n,m;

	si(n); si(m);

	int x,y;

	gr.assign(n+1,vector<int>());

	out.assign(n+1,0);

	ans.assign(n+1,0);

	vector<pi> inv(m);

	aux.reserve(n);

	vi in(n+1);

	visited.assign(n+1,false);

	fore(i,0,m){

		si(x);si(y);

		inv[i] = pi(x,y);

		out[x]++;

		in[y]++;

	}

	fore(i,1,n+1)

		gr[i].reserve( in[i] );

	fore(i,0,m){

		x = inv[i].first;

		y = inv[i].second;

		gr[x].push_back(y);

	}

		

	fore(i,1,n+1)

		if(!visited[i])

			dfs(i);

	vi dp(n+1);

	//printf("aux: ");for(int i:aux) printf("%d ", i);printf("\n");

	for(int v: aux){

		if(gr[v].size() == 0)

			dp[v] = 0;

		else{

			int k = 0;

			for(int u: gr[v])

				k = max(k, dp[u]);

			dp[v] = k+1;

		}

	}

	int anss = 0;

	//printf("dp: ");for(int i:dp) printf("%d ", i);printf("\n");

	

	for(int i: dp)

		anss = max(anss, i);

	

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

}

int main(){

	solve();

	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: 4.3884192217861795x):
#include<bits/stdc++.h>

#define si(a) scanf("%d", &a)

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

using namespace std;

typedef long long ll;

typedef pair<int,int> pi;

typedef vector<int> vi;

vector<vector<int> > gr;

vi out;

vi ans;

vector<bool> visited;

vi aux;

void dfs(int u){

	visited[u] = true;

	//ans[u] = max(ans[u], val);

	fore(j,0,gr[u].size()){

		if(!visited[ gr[u][j] ])

			dfs(gr[u][j]);

		//ans[u] = max(ans[u], ans[ gr[u][j] ] + 1);

	}

	aux.push_back(u);

}

void solve(){

	int n,m;

	si(n); si(m);

	int x,y;

	gr.assign(n+1,vector<int>());

	out.assign(n+1,0);

	ans.assign(n+1,0);

	vector<pi> inv(m);

	aux.reserve(n);

	vi in(n+1);

	visited.assign(n+1,false);

	fore(i,0,m){

		si(x);si(y);

		inv[i] = pi(x,y);

		out[x]++;

		in[y]++;

	}

	fore(i,1,n+1)

		gr[i].reserve( in[i] );

	fore(i,0,m){

		x = inv[i].first;

		y = inv[i].second;

		gr[x].push_back(y);

	}

		

	fore(i,1,n+1)

		if(!visited[i])

			dfs(i);

	vi dp(n+1);

	//printf("aux: ");for(int i:aux) printf("%d ", i);printf("\n");

	for(int v: aux){

		if(gr[v].size() == 0)

			dp[v] = 0;

		else{

			int k = 0;

			for(int u: gr[v])

				k = max(k, dp[u]);

			dp[v] = k+1;

		}

	}

	int anss = 0;

	//printf("dp: ");for(int i:dp) printf("%d ", i);printf("\n");

	

	for(int i: dp)

		anss = max(anss, i);

	

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

}

int main(){

	solve();

	return 0;

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

using namespace std;

const int N=100005;

int dp[N],vis[N];

vector<int>e[N],p;

void dfs(int v)

{

	vis[v]=1;

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

		if(!vis[e[v][i]])

			dfs(e[v][i]);

	p.push_back(v);

}

int main()

{

	int n,m;

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

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

	{

		int x,y;

		scanf("%d%d",&x,&y);

		e[x].push_back(y);

	}

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

		if(!vis[i])

			dfs(i);

	reverse(p.begin(),p.end());

	int ans=0;

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

	{

		int v=p[i];

		for(int j=0;j<e[v].size();j++)

			dp[e[v][j]]=max(dp[e[v][j]],dp[p[i]]+1);

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

	}

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

	return 0;

}


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

#define si(a) scanf("%d", &a)

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

using namespace std;

typedef long long ll;

typedef pair<int,int> pi;

typedef vector<int> vi;

vector<vector<int> > gr;

vi out;

vi ans;

vector<bool> visited;

vi aux;

void dfs(int u){

	visited[u] = true;

	//ans[u] = max(ans[u], val);

	fore(j,0,gr[u].size()){

		if(!visited[ gr[u][j] ])

			dfs(gr[u][j]);

		//ans[u] = max(ans[u], ans[ gr[u][j] ] + 1);

	}

	aux.push_back(u);

}

void solve(){

	int n,m;

	si(n); si(m);

	int x,y;

	gr.assign(n+1,vector<int>());

	out.assign(n+1,0);

	ans.assign(n+1,0);

	vector<pi> inv(m);

	aux.reserve(n);

	vi in(n+1);

	visited.assign(n+1,false);

	fore(i,0,m){

		si(x);si(y);

		inv[i] = pi(x,y);

		out[x]++;

		in[y]++;

	}

	fore(i,1,n+1)

		gr[i].reserve( in[i] );

	fore(i,0,m){

		x = inv[i].first;

		y = inv[i].second;

		gr[x].push_back(y);

	}

		

	fore(i,1,n+1)

		if(!visited[i])

			dfs(i);

	vi dp(n+1);

	//printf("aux: ");for(int i:aux) printf("%d ", i);printf("\n");

	for(int v: aux){

		if(gr[v].size() == 0)

			dp[v] = 0;

		else{

			int k = 0;

			for(int u: gr[v])

				k = max(k, dp[u]);

			dp[v] = k+1;

		}

	}

	int anss = 0;

	//printf("dp: ");for(int i:dp) printf("%d ", i);printf("\n");

	

	for(int i: dp)

		anss = max(anss, i);

	

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

}

int main(){

	solve();

	return 0;

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

using namespace std;



typedef long long ll;

typedef long double ld;

typedef pair<int,int> pii;

typedef pair<ll,ll> pll;



const int mx=1e5+5;



int dp[mx];

vector<int>g[mx];



int path(int u)

{

	if(dp[u]) return dp[u];

	if(g[u].size()==0) return dp[u]=0;

	for(auto it: g[u])

	{

		dp[u]=max(dp[u],1+path(it));

	}

	return dp[u];

}		



void solve()

{

	int n,m;

	cin>>n>>m;

	

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

	{

		int u,v;

		cin>>u>>v;

		g[u].push_back(v);

	}

	

	int ans=0;

	

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

	{

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

	}

	cout<<ans;

}



int main()

{

	ios::sync_with_stdio(false);

	cin.tie(0); cout.tie(0);

	

	solve();

							                                				

	cerr<<"\nTime elapsed: " << 1000.0 * clock() / CLOCKS_PER_SEC << " ms\n";

	

	return 0;

}

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

#define si(a) scanf("%d", &a)

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

using namespace std;

typedef long long ll;

typedef pair<int,int> pi;

typedef vector<int> vi;

vector<vector<int> > gr;

vi out;

vi ans;

vector<bool> visited;

vi aux;

void dfs(int u){

	visited[u] = true;

	//ans[u] = max(ans[u], val);

	fore(j,0,gr[u].size()){

		if(!visited[ gr[u][j] ])

			dfs(gr[u][j]);

		//ans[u] = max(ans[u], ans[ gr[u][j] ] + 1);

	}

	aux.push_back(u);

}

void solve(){

	int n,m;

	si(n); si(m);

	int x,y;

	gr.assign(n+1,vector<int>());

	out.assign(n+1,0);

	ans.assign(n+1,0);

	vector<pi> inv(m);

	aux.reserve(n);

	vi in(n+1);

	visited.assign(n+1,false);

	fore(i,0,m){

		si(x);si(y);

		inv[i] = pi(x,y);

		out[x]++;

		in[y]++;

	}

	fore(i,1,n+1)

		gr[i].reserve( in[i] );

	fore(i,0,m){

		x = inv[i].first;

		y = inv[i].second;

		gr[x].push_back(y);

	}

		

	fore(i,1,n+1)

		if(!visited[i])

			dfs(i);

	vi dp(n+1);

	//printf("aux: ");for(int i:aux) printf("%d ", i);printf("\n");

	for(int v: aux){

		if(gr[v].size() == 0)

			dp[v] = 0;

		else{

			int k = 0;

			for(int u: gr[v])

				k = max(k, dp[u]);

			dp[v] = k+1;

		}

	}

	int anss = 0;

	//printf("dp: ");for(int i:dp) printf("%d ", i);printf("\n");

	

	for(int i: dp)

		anss = max(anss, i);

	

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

}

int main(){

	solve();

	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: 3.9555061958253215x):
#include<bits/stdc++.h>

#define si(a) scanf("%d", &a)

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

using namespace std;

typedef long long ll;

typedef pair<int,int> pi;

typedef vector<int> vi;

vector<vector<int> > gr;

vi out;

vi ans;

vector<bool> visited;

vi aux;

void dfs(int u){

	visited[u] = true;

	//ans[u] = max(ans[u], val);

	fore(j,0,gr[u].size()){

		if(!visited[ gr[u][j] ])

			dfs(gr[u][j]);

		//ans[u] = max(ans[u], ans[ gr[u][j] ] + 1);

	}

	aux.push_back(u);

}

void solve(){

	int n,m;

	si(n); si(m);

	int x,y;

	gr.assign(n+1,vector<int>());

	out.assign(n+1,0);

	ans.assign(n+1,0);

	vector<pi> inv(m);

	aux.reserve(n);

	vi in(n+1);

	visited.assign(n+1,false);

	fore(i,0,m){

		si(x);si(y);

		inv[i] = pi(x,y);

		out[x]++;

		in[y]++;

	}

	fore(i,1,n+1)

		gr[i].reserve( in[i] );

	fore(i,0,m){

		x = inv[i].first;

		y = inv[i].second;

		gr[x].push_back(y);

	}

		

	fore(i,1,n+1)

		if(!visited[i])

			dfs(i);

	vi dp(n+1);

	//printf("aux: ");for(int i:aux) printf("%d ", i);printf("\n");

	for(int v: aux){

		if(gr[v].size() == 0)

			dp[v] = 0;

		else{

			int k = 0;

			for(int u: gr[v])

				k = max(k, dp[u]);

			dp[v] = k+1;

		}

	}

	int anss = 0;

	//printf("dp: ");for(int i:dp) printf("%d ", i);printf("\n");

	

	for(int i: dp)

		anss = max(anss, i);

	

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

}

int main(){

	solve();

	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: 6.374256816789602x):
#include<bits/stdc++.h>

#define si(a) scanf("%d", &a)

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

using namespace std;

typedef long long ll;

typedef pair<int,int> pi;

typedef vector<int> vi;

vector<vector<int> > gr;

vi out;

vi ans;

vector<bool> visited;

vi aux;

void dfs(int u){

	visited[u] = true;

	//ans[u] = max(ans[u], val);

	fore(j,0,gr[u].size()){

		if(!visited[ gr[u][j] ])

			dfs(gr[u][j]);

		//ans[u] = max(ans[u], ans[ gr[u][j] ] + 1);

	}

	aux.push_back(u);

}

void solve(){

	int n,m;

	si(n); si(m);

	int x,y;

	gr.assign(n+1,vector<int>());

	out.assign(n+1,0);

	ans.assign(n+1,0);

	vector<pi> inv(m);

	aux.reserve(n);

	vi in(n+1);

	visited.assign(n+1,false);

	fore(i,0,m){

		si(x);si(y);

		inv[i] = pi(x,y);

		out[x]++;

		in[y]++;

	}

	fore(i,1,n+1)

		gr[i].reserve( in[i] );

	fore(i,0,m){

		x = inv[i].first;

		y = inv[i].second;

		gr[x].push_back(y);

	}

		

	fore(i,1,n+1)

		if(!visited[i])

			dfs(i);

	vi dp(n+1);

	//printf("aux: ");for(int i:aux) printf("%d ", i);printf("\n");

	for(int v: aux){

		if(gr[v].size() == 0)

			dp[v] = 0;

		else{

			int k = 0;

			for(int u: gr[v])

				k = max(k, dp[u]);

			dp[v] = k+1;

		}

	}

	int anss = 0;

	//printf("dp: ");for(int i:dp) printf("%d ", i);printf("\n");

	

	for(int i: dp)

		anss = max(anss, i);

	

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

}

int main(){

	solve();

	return 0;

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

using namespace std;

vector<int>adj[100005];

int dp[100005];

bool vis[100005];

void dfs(int u)

{

    vis[u]=true;

    for(auto v:adj[u])

    {

        if(vis[v]==false)

            dfs(v);

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

    }





}

int main()

{

    int n,m;

    cin>>n>>m;

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

    {

        int u,v;

        cin>>u>>v;

        adj[u].push_back(v);

    }

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

    {

        if(vis[i]==false)

            dfs(i);

    }

    int ans=0;

    for(int i=1; i<=n; i++) ans=max(ans,dp[i]);

    cout<<ans<<endl;

}


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

#define si(a) scanf("%d", &a)

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

using namespace std;

typedef long long ll;

typedef pair<int,int> pi;

typedef vector<int> vi;

vector<vector<int> > gr;

vi out;

vi ans;

vector<bool> visited;

vi aux;

void dfs(int u){

	visited[u] = true;

	//ans[u] = max(ans[u], val);

	fore(j,0,gr[u].size()){

		if(!visited[ gr[u][j] ])

			dfs(gr[u][j]);

		//ans[u] = max(ans[u], ans[ gr[u][j] ] + 1);

	}

	aux.push_back(u);

}

void solve(){

	int n,m;

	si(n); si(m);

	int x,y;

	gr.assign(n+1,vector<int>());

	out.assign(n+1,0);

	ans.assign(n+1,0);

	vector<pi> inv(m);

	aux.reserve(n);

	vi in(n+1);

	visited.assign(n+1,false);

	fore(i,0,m){

		si(x);si(y);

		inv[i] = pi(x,y);

		out[x]++;

		in[y]++;

	}

	fore(i,1,n+1)

		gr[i].reserve( in[i] );

	fore(i,0,m){

		x = inv[i].first;

		y = inv[i].second;

		gr[x].push_back(y);

	}

		

	fore(i,1,n+1)

		if(!visited[i])

			dfs(i);

	vi dp(n+1);

	//printf("aux: ");for(int i:aux) printf("%d ", i);printf("\n");

	for(int v: aux){

		if(gr[v].size() == 0)

			dp[v] = 0;

		else{

			int k = 0;

			for(int u: gr[v])

				k = max(k, dp[u]);

			dp[v] = k+1;

		}

	}

	int anss = 0;

	//printf("dp: ");for(int i:dp) printf("%d ", i);printf("\n");

	

	for(int i: dp)

		anss = max(anss, i);

	

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

}

int main(){

	solve();

	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: 3.929237994855071x):
#include<bits/stdc++.h>

#define si(a) scanf("%d", &a)

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

using namespace std;

typedef long long ll;

typedef pair<int,int> pi;

typedef vector<int> vi;

vector<vector<int> > gr;

vi out;

vi ans;

vector<bool> visited;

vi aux;

void dfs(int u){

	visited[u] = true;

	//ans[u] = max(ans[u], val);

	fore(j,0,gr[u].size()){

		if(!visited[ gr[u][j] ])

			dfs(gr[u][j]);

		//ans[u] = max(ans[u], ans[ gr[u][j] ] + 1);

	}

	aux.push_back(u);

}

void solve(){

	int n,m;

	si(n); si(m);

	int x,y;

	gr.assign(n+1,vector<int>());

	out.assign(n+1,0);

	ans.assign(n+1,0);

	vector<pi> inv(m);

	aux.reserve(n);

	vi in(n+1);

	visited.assign(n+1,false);

	fore(i,0,m){

		si(x);si(y);

		inv[i] = pi(x,y);

		out[x]++;

		in[y]++;

	}

	fore(i,1,n+1)

		gr[i].reserve( in[i] );

	fore(i,0,m){

		x = inv[i].first;

		y = inv[i].second;

		gr[x].push_back(y);

	}

		

	fore(i,1,n+1)

		if(!visited[i])

			dfs(i);

	vi dp(n+1);

	//printf("aux: ");for(int i:aux) printf("%d ", i);printf("\n");

	for(int v: aux){

		if(gr[v].size() == 0)

			dp[v] = 0;

		else{

			int k = 0;

			for(int u: gr[v])

				k = max(k, dp[u]);

			dp[v] = k+1;

		}

	}

	int anss = 0;

	//printf("dp: ");for(int i:dp) printf("%d ", i);printf("\n");

	

	for(int i: dp)

		anss = max(anss, i);

	

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

}

int main(){

	solve();

	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: 1.2382818930584554x):
#include<bits/stdc++.h>

using namespace std;

const int maxn=1e5+5;

int dp[maxn],deg[maxn];

vector<int> G[maxn];



int get(int u)

{

	if(dp[u]) return dp[u];

	for(auto it:G[u])

	dp[u]=max(dp[u],get(it)+1);

	return dp[u];

}



int main()

{

	int n,m,x,y;

	cin>>n>>m;

	

	while(m--) 

	{

		 cin>>x>>y;

		 deg[y]++;

		 G[x].push_back(y);

	}

	

	int ans=0;

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

	if(deg[i]==0) ans=max(ans,get(i));

	

	cout<<ans<<endl;

	

	return 0;

 }
// Slower C++ solution:


/**

    And in the end, the love you take is equal to the love you make.



        I LOVE YOU LAURA.

**/



#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>

#include <ext/pb_ds/tree_policy.hpp>

#include <ext/rope>



#define _CRT_SECURE_NO_DEPRECATE

#define _CRT_DISABLE_PERFCRIT_LOCKS



#define findOrder find_by_order

#define orderKey order_of_key



#define isOn(mask, i) (mask & (1 << i))

#define turn(mask, i) (mask |= (1 << i))

#define switch(mask, i) (mask &= ~(1 << i))

#define change(mask, i) (mask ^= (1 << i))

#define lowbit(mask) (mask & (-mask))

#define turnAll(mask, n) (mask = (1 << n) - 1)

#define switchLastBit(mask) (mask & (mask - 1))

#define turnLastZero(mask) (mask | (mask + 1))

#define modulo(x, mod) ((x) & (mod - 1))

#define log2(x) (31 - __builtin_clz(x))



#define mkp make_pair

#define pb push_back

#define pf push_front

#define eb emplace_back

#define ef emplace_front

#define ins insert

#define rsz resize

#define f first

#define s second

#define lb lower_bound

#define ub upper_bound



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

#define all(x) begin(x), end(x)

#define rall(x) rbegin(x), rend(x)



#define debug(x) (cerr << x << " ")



using namespace std;

using namespace __gnu_pbds;

using namespace __gnu_cxx;



typedef double db;

typedef long long ll;

typedef long double ld;

typedef unsigned long long ull;



typedef pair<int, int> ii;

typedef pair<ll,ll> pll;

typedef pair<ld,ld> pdb;

typedef pair<int, ii> tri;

typedef complex<ld> cd;



typedef vector<int> vi;

typedef vector<ii> vii;

typedef vector<ld> vdb;

typedef vector<cd> vcd;

typedef vector<ll> vll;

typedef vector<string> vs;

typedef vector<vll> matrix;



typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_tree;



const ll mod = 1e9+7;

const int maxn = 1e5+2;

const int pi = 2 * acos(0.0);

const db eps = 1e-9;



ll n, m;

vll graph[maxn];

ll dp[maxn];



ll dfs (int node){

    ll &ans = dp[node];



    if (ans != -1) return ans;



    for (auto v: graph[node]){

        ans = max(ans, dfs(v) + 1);

    }

    return ans;

}



int main()

{

    ios_base::sync_with_stdio(0);

    cin.tie(0); cout.tie(0);



    memset(dp, -1, sizeof dp);



    cin >> n >> m;



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

        int a, b; cin >> a >> b;



        graph[a].pb(b);

    }



    ll ans = 0;

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

        ans = max(ans, dfs(i) + 1);

    }



    cout << ans << "\n";



    return 0;

}


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

using namespace std;

const int maxn=1e5+5;

int dp[maxn],deg[maxn];

vector<int> G[maxn];



int get(int u)

{

	if(dp[u]) return dp[u];

	for(auto it:G[u])

	dp[u]=max(dp[u],get(it)+1);

	return dp[u];

}



int main()

{

	int n,m,x,y;

	cin>>n>>m;

	

	while(m--) 

	{

		 cin>>x>>y;

		 deg[y]++;

		 G[x].push_back(y);

	}

	

	int ans=0;

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

	if(deg[i]==0) ans=max(ans,get(i));

	

	cout<<ans<<endl;

	

	return 0;

 }