Problem:
Score : 100 points

Problem Statement

There is a directed graph G with N vertices and M edges.
The vertices are numbered 1, 2, \ldots, N, and for each i (1 \leq i \leq M), the i-th directed edge goes from Vertex x_i to y_i.
G does not contain directed cycles.

Find the length of the longest directed path in G.
Here, the length of a directed path is the number of edges in it.

Constraints

All values in input are integers.

2 \leq N \leq 10^5

1 \leq M \leq 10^5

1 \leq x_i, y_i \leq N

All pairs (x_i, y_i) are distinct.

G does not contain directed cycles.

Input

Input is given from Standard Input in the following format:

N M
x_1 y_1
x_2 y_2
:
x_M y_M

Output

Print the length of the longest directed path in G.

Sample Input 1

4 5
1 2
1 3
3 2
2 4
3 4

Sample Output 1

3

The red directed path in the following figure is the longest:

Sample Input 2

6 3
2 3
4 5
5 6

Sample Output 2

2

The red directed path in the following figure is the longest:

Sample Input 3

5 8
5 3
2 3
2 4
5 2
5 1
1 4
4 3
1 3

Sample Output 3

3

The red directed path in the following figure is one of the longest:

Solution in C++14 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include<bits/stdc++.h>
#define ll long long int
#define ii int
#define jmp cout<<"\n"
#define vl vector<ll>
#define pb push_back
#define fast ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define printv(v) for(auto x:v) cout<<x<<" "; jmp;
#define endll "\n"
#define SORT(v) sort(v.begin(),v.end())
#define REV(x)  reverse(x.begin(),x.end())
#define UNI(a) a.erase( unique( a.begin(), a.end() ), a.end() )
#define si(x) x.size()
#define ff first
#define ss second
#define iin insert
using namespace std;
ll ctr, mx;
void dfs(vector<vector<ll>>&g, ll s, ll ctr)
{

	for (auto x : g[s])
	{
		mx = max(mx, ctr);
		dfs(g, x, ctr + 1);
	}
}
void solve()
{
	ll n, m, l, r;
	cin >> n >> m;
	vector<vector<ll> >adj(n + 1);
	for (ll i = 0; i < m; i++)
	{
		cin >> l >> r;
		adj[l].pb(r);
	}

	bool vis[n + 1] = {0};
	ll dp[n + 1] = {0};
	ll res = 0;
	mx = 0, ctr = 0;
	for (ll i = 1; i <= n; i++)
	{
		mx = 0;
		dfs(adj, i, ctr);
		res = max(res, mx);
	}
	cout << res + 1 << endll;

}
int main()
{
	fast;

	// ll t;
	// cin >> t;
	// while (t--)
	solve();
	return 0;
}