← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	line := strings.TrimSpace(scanner.Text())
	parts := strings.Split(line, " ")
	n, _ := strconv.Atoi(parts[0])
	m, _ := strconv.Atoi(parts[1])

	outDeg := make([]int, n+1)
	inDeg := make([]int, n+1)
	edges := make([][2]int, 0, m)

	for i := 0; i < m; i++ {
		scanner.Scan()
		line = strings.TrimSpace(scanner.Text())
		parts = strings.Split(line, " ")
		u, _ := strconv.Atoi(parts[0])
		v, _ := strconv.Atoi(parts[1])
		outDeg[u]++
		inDeg[v]++
		edges = append(edges, [2]int{u, v})
	}

	adj := make([][]int, n+1)
	newIn := make([]int, n+1)

	for _, e := range edges {
		u, v := e[0], e[1]
		if outDeg[u] >= 2 && inDeg[v] >= 2 {
			adj[u] = append(adj[u], v)
			newIn[v]++
		}
	}

	q := make([]int, 0, n)
	for i := 1; i <= n; i++ {
		if newIn[i] == 0 {
			q = append(q, i)
		}
	}

	dp := make([]int, n+1)
	for i := 1; i <= n; i++ {
		dp[i] = 1
	}

	ans := 1
	for len(q) > 0 {
		u := q[0]
		q = q[1:]
		if dp[u] > ans {
			ans = dp[u]
		}
		for _, v := range adj[u] {
			if dp[u]+1 > dp[v] {
				dp[v] = dp[u] + 1
			}
			newIn[v]--
			if newIn[v] == 0 {
				q = append(q, v)
			}
		}
	}

	fmt.Println(ans)
}
```