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 Pascal (FPC 2.6.2) (judge verdict: Accepted)

Program LongestPath;
uses math;
type Rec=record
     x:longint;
     y:longint;
     end;
var Head,Adj,F :array[0..100005] of longint;
    E:array[1..100005] of Rec;
    Avai:array[1..100005] of boolean;
    n,m,res,i,maxx:longint;
    fi,fo:text;
//------------------------------------------
procedure DFS(i:longint);
var j:longint;
begin
Avai[i]:=false;
for j:=Head[i]+1 to Head[i+1] do begin
                                 if not Avai[adj[j]] then F[i]:=max(F[i],F[adj[j]]+1)
                                 else DFS(adj[j]);
                                 F[i]:=max(F[i],F[adj[j]]+1);
                                 end;
end;
//------------------------------------------
begin
//assign(fi,'LongestPath.inp');reset(fi);
readln(n,m);
for i:=1 to m do begin
                 With E[i] do begin
                              readln(x,y);
                              inc(Head[x]);
                              end;
                 end;
for i:=1 to n do begin
                 Head[i]:=Head[i]+Head[i-1];
                 end;
for i:=m downto 1 do begin
                     With E[i] do begin
                                  Adj[Head[x]]:=y;
                                  dec(Head[x]);
                                  end;
                     end;
Head[n+1]:=m;
fillchar(Avai,sizeof(Avai),true);
for i:=1 to n do begin
                 if Avai[i] then
                 DFS(i);
                 end;
for i:=1 to n do begin
                 maxx:=max(maxx,F[i]);
                 end;
Writeln(maxx);
//readln;
end.