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 Rust (1.42.0) (judge verdict: Accepted)

#![allow(unused_macros)]
#![allow(dead_code)]
#![allow(unused_imports)]

use smallvec::alloc::collections::VecDeque;
use text_io::*;

fn main() {
    const U_INF: usize = 1 << 50;
    const I_INF: isize = 1 << 50;

    let n: usize = read!();
    let m: usize = read!();
    let mut vertexes = vec![vec![]; n];
    let mut deg = vec![0; n];
    for _ in 0..m {
        let mut x: usize = read!();
        let mut y: usize = read!();
        x -= 1;
        y -= 1;
        vertexes[x].push(y);
        deg[y] += 1;
    }

    let mut queue = VecDeque::new();
    let mut sorted = Vec::new();
    for (i, _) in deg.iter().enumerate().filter(|(a, &b)| b == 0) {
        queue.push_back(i);
    }

    while let Some(q) = queue.pop_front() {
        sorted.push(q);

        for &x in &vertexes[q] {
            deg[x] -= 1;
            if deg[x] == 0 {
                queue.push_back(x);
            }
        }
    }

    let mut dp = vec![0; n + 10];
    let mut dpx = sorted
        .iter()
        .zip((0..))
        .map(|(&u, index)| (u, index))
        .collect::<Vec<(usize, usize)>>();
    dpx.sort();
    let dpx = dpx.iter().map(|x| x.1).collect::<Vec<usize>>();

    for i in 0..n {
        let now = sorted[i];
        for &j in &vertexes[now] {
            dp[dpx[j]] = (dp[dpx[j]]).max(dp[i] + 1);
        }
    }

    println!("{}", dp.iter().max().unwrap());
}