← Home
```go
package main

import (
	"fmt"
	"io"
	"math/bits"
	"os"
)

func main() {
	buf, _ := io.ReadAll(os.Stdin)
	var pos int
	readInt := func() int {
		for pos < len(buf) && (buf[pos] < '0' || buf[pos] > '9') {
			pos++
		}
		if pos >= len(buf) {
			return 0
		}
		res := 0
		for pos < len(buf) && buf[pos] >= '0' && buf[pos] <= '9' {
			res = res*10 + int(buf[pos]-'0')
			pos++
		}
		return res
	}

	n := readInt()
	m := readInt()
	if n == 0 {
		return
	}

	head := make([]int, n+1)
	for i := range head {
		head[i] = -1
	}
	to := make([]int, m)
	next := make([]int, m)
	inDeg := make([]int, n+1)
	outDeg := make([]int, n+1)

	for i := 0; i < m; i++ {
		u := readInt()
		v := readInt()
		to[i] = v
		next[i] = head[u]
		head[u] = i
		inDeg[v]++
		outDeg[u]++
	}

	var S, T []int
	for i := 1; i <= n; i++ {
		if inDeg[i] == 0 {
			S = append(S, i)
		}
		if outDeg[i] == 0 {
			T = append(T, i)
		}
	}

	k := len(S)
	if k <= 1 {
		fmt.Println("YES")
		return
	}

	sinkIdx := make([]int, n+1)
	for i := range sinkIdx {
		sinkIdx[i] = -1
	}
	for j, t := range T {
		sinkIdx[t] = j
	}

	reach := make([]uint32, k)
	visited := make([]int, n+1)
	q := make([]int, 0, n)

	for i, s := range S {
		marker := i + 1
		q = q[:0]
		q = append(q, s)
		visited[s] = marker
		for len(q) > 0 {
			u := q[0]
			q = q[1:]
			if sinkIdx[u] != -1 {
				reach[i] |= 1 << sinkIdx[u]
			}
			for e := head[u]; e != -1; e = next[e] {
				v := to[e]
				if visited[v] != marker {
					visited[v] = marker
					q = append(q, v)
				}
			}
		}
	}

	N := make([]uint32, 1<<k)
	for i := 0; i < k; i++ {
		N[1<<i] = reach[i]
	}

	limit := uint32((1 << k) - 1)
	for mask := uint32(1); mask < limit; mask++ {
		if mask&(mask-1) != 0 {
			lsb := mask & -mask
			N[mask] = N[mask^lsb] | N[lsb]
		}
		if bits.OnesCount32(N[mask]) <= bits.OnesCount32(mask) {
			fmt.Println("NO")
			return
		}
	}

	fmt.Println("YES")
}
```