#include"../template.h"// Longest path in graphintn,m;vector<vector<int>>adj;vector<int>vis,d;stack<int>topo;voidtopoSort(intu){vis[u]=1;for(intv:adj[u]){if(vis[v])continue;topoSort(v);}topo.push(u);}voidsolve(){cin>>n>>m;adj.resize(n+1);for(inti=0;i<m;i++){intu,v;cin>>u>>v;adj[u].push_back(v);}vis.resize(n+1);for(inti=1;i<=n;i++){if(vis[i])continue;topoSort(i);}fill(all(vis),0);d.resize(n+1,0);while(!topo.empty()){intu=topo.top();topo.pop();for(intv:adj[u]){d[v]=max(d[v],d[u]+1);}}cout<<*max_element(all(d));}
#line 2 "template.h"
#include<bits/stdc++.h>usingnamespacestd;#define ll long long
#define MOD (ll)(1e9+7)
#define all(x) (x).begin(),(x).end()
#define unique(x) x.erase(unique(all(x)), x.end())
#define INF32 ((1ull<<31)-1)
#define INF64 ((1ull<<63)-1)
#define inf (ll)1e18
#define vi vector<int>
#define pii pair<int, int>
#define pll pair<ll, ll>
#define fi first
#define se second
constintmod=998244353;voidsolve();intmain(){ios_base::sync_with_stdio(false);cin.tie(NULL);// cin.exceptions(cin.failbit);// int t; cin >> t;// while(t--)solve();cerr<<"\nTime run: "<<1000*clock()/CLOCKS_PER_SEC<<"ms"<<'\n';return0;}#line 2 "Dp/DAG.h"
// Longest path in graphintn,m;vector<vector<int>>adj;vector<int>vis,d;stack<int>topo;voidtopoSort(intu){vis[u]=1;for(intv:adj[u]){if(vis[v])continue;topoSort(v);}topo.push(u);}voidsolve(){cin>>n>>m;adj.resize(n+1);for(inti=0;i<m;i++){intu,v;cin>>u>>v;adj[u].push_back(v);}vis.resize(n+1);for(inti=1;i<=n;i++){if(vis[i])continue;topoSort(i);}fill(all(vis),0);d.resize(n+1,0);while(!topo.empty()){intu=topo.top();topo.pop();for(intv:adj[u]){d[v]=max(d[v],d[u]+1);}}cout<<*max_element(all(d));}