← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Buffer(make([]byte, 1024*1024*10), 1024*1024*10)
	scanner.Split(bufio.ScanWords)

	var readInt = func() int {
		scanner.Scan()
		res := 0
		for _, b := range scanner.Bytes() {
			res = res*10 + int(b-'0')
		}
		return res
	}

	if !scanner.Scan() {
		return
	}
	res := 0
	for _, b := range scanner.Bytes() {
		res = res*10 + int(b-'0')
	}
	t := res

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	for tc := 0; tc < t; tc++ {
		n := readInt()
		m := readInt()

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

		for i := 0; i < m; i++ {
			u := readInt()
			v := readInt()
			if u != v {
				adj[u] = append(adj[u], v)
				rev_adj[v] = append(rev_adj[v], u)
			}
		}

		visited := make([]bool, n+1)
		order := make([]int, 0, n)
		stack := make([]int, 0, n)
		edge_idx := make([]int, n+1)

		for i := 1; i <= n; i++ {
			if !visited[i] {
				visited[i] = true
				stack = append(stack, i)
				for len(stack) > 0 {
					u := stack[len(stack)-1]
					if edge_idx[u] < len(rev_adj[u]) {
						v := rev_adj[u][edge_idx[u]]
						edge_idx[u]++
						if !visited[v] {
							visited[v] = true
							stack = append(stack, v)
						}
					} else {
						stack = stack[:len(stack)-1]
						order = append(order, u)
					}
				}
			}
		}

		for i := 1; i <= n; i++ {
			visited[i] = false
		}

		v := order[n-1]
		visited[v] = true
		stack = stack[:0]
		stack = append(stack, v)
		for len(stack) > 0 {
			u := stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			for _, nxt := range adj[u] {
				if !visited[nxt] {
					visited[nxt] = true
					stack = append(stack, nxt)
				}
			}
		}

		var J []int
		var P []int
		for i := 1; i <= n; i++ {
			if visited[i] {
				J = append(J, i)
			} else {
				P = append(P, i)
			}
		}

		if len(J) == n {
			fmt.Fprintln(out, "No")
		} else {
			fmt.Fprintln(out, "Yes")
			fmt.Fprintf(out, "%d %d\n", len(J), len(P))
			for i, val := range J {
				if i > 0 {
					fmt.Fprint(out, " ")
				}
				fmt.Fprint(out, val)
			}
			fmt.Fprintln(out)
			for i, val := range P {
				if i > 0 {
					fmt.Fprint(out, " ")
				}
				fmt.Fprint(out, val)
			}
			fmt.Fprintln(out)
		}
	}
}