← Home
package main

import (
	"bufio"
	"io"
	"os"
	"strconv"
)

func main() {
	data, _ := io.ReadAll(os.Stdin)
	p := 0
	nextInt := func() int {
		for p < len(data) && (data[p] < '0' || data[p] > '9') {
			p++
		}
		x := 0
		for p < len(data) && data[p] >= '0' && data[p] <= '9' {
			x = x*10 + int(data[p]-'0')
			p++
		}
		return x
	}

	n := nextInt()
	m := nextInt()

	head := make([]int, n+1)
	outdeg := make([]int, n+1)
	rem := make([]int, n+1)
	dist := make([]int, n+1)
	done := make([]bool, n+1)

	const inf = int(1 << 30)

	for i := 0; i <= n; i++ {
		head[i] = -1
		dist[i] = inf
	}

	to := make([]int, m)
	nxt := make([]int, m)

	for i := 0; i < m; i++ {
		u := nextInt()
		v := nextInt()
		outdeg[u]++
		to[i] = u
		nxt[i] = head[v]
		head[v] = i
	}

	s := nextInt()
	t := nextInt()

	copy(rem, outdeg)

	capQ := m + n + 5
	dq := make([]int, capQ)
	l, r, size := 0, 1, 1
	dq[0] = t
	dist[t] = 0

	for size > 0 {
		v := dq[l]
		l++
		if l == capQ {
			l = 0
		}
		size--

		if done[v] {
			continue
		}
		done[v] = true
		d := dist[v]

		for e := head[v]; e != -1; e = nxt[e] {
			u := to[e]
			if done[u] {
				continue
			}

			rem[u]--

			if rem[u] == 0 && outdeg[u] > 0 && d < dist[u] {
				dist[u] = d
				l--
				if l < 0 {
					l = capQ - 1
				}
				dq[l] = u
				size++
			}

			if outdeg[u] > 1 {
				nd := d + 1
				if nd < dist[u] {
					dist[u] = nd
					dq[r] = u
					r++
					if r == capQ {
						r = 0
					}
					size++
				}
			}
		}
	}

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	if dist[s] >= inf {
		w.WriteString("-1\n")
	} else {
		w.WriteString(strconv.Itoa(dist[s]))
		w.WriteByte('\n')
	}
	w.Flush()
}