← Home
package main

import (
	"bufio"
	"container/heap"
	"fmt"
	"os"
	"strconv"
)


type Item struct {
	node int
	cost int
}


type PriorityQueue []*Item

func (pq PriorityQueue) Len() int { return len(pq) }

func (pq PriorityQueue) Less(i, j int) bool {
	return pq[i].cost < pq[j].cost
}

func (pq PriorityQueue) Swap(i, j int) {
	pq[i], pq[j] = pq[j], pq[i]
}

func (pq *PriorityQueue) Push(x interface{}) {
	item := x.(*Item)
	*pq = append(*pq, item)
}

func (pq *PriorityQueue) Pop() interface{} {
	old := *pq
	n := len(old)
	item := old[n-1]
	*pq = old[0 : n-1]
	return item
}

func main() {
	
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	
	readInt := func() int {
		scanner.Scan()
		val, _ := strconv.Atoi(scanner.Text())
		return val
	}

	
	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())
	m := readInt()

	
	
	revAdj := make([][]int, n+1)
	
	outDeg := make([]int, n+1)

	for i := 0; i < m; i++ {
		u := readInt()
		v := readInt()
		revAdj[v] = append(revAdj[v], u)
		outDeg[u]++
	}

	s := readInt()
	t := readInt()

	if s == t {
		fmt.Println(0)
		return
	}

	
	
	dist := make([]int, n+1)
	for i := range dist {
		dist[i] = -1 
	}
	
	processedCount := make([]int, n+1)

	pq := &PriorityQueue{}
	heap.Init(pq)

	
	dist[t] = 0
	heap.Push(pq, &Item{node: t, cost: 0})

	for pq.Len() > 0 {
		top := heap.Pop(pq).(*Item)
		u := top.node
		d := top.cost

		
		if dist[u] != -1 && d > dist[u] {
			continue
		}

		if u == s {
			fmt.Println(d)
			return
		}

		
		for _, v := range revAdj[u] {
			processedCount[v]++

			
			
			
			
			costOrder := d + 1
			if dist[v] == -1 || costOrder < dist[v] {
				dist[v] = costOrder
				heap.Push(pq, &Item{node: v, cost: costOrder})
			}

			
			
			
			
			
			if processedCount[v] == outDeg[v] {
				costNoOrder := d
				if dist[v] == -1 || costNoOrder < dist[v] {
					dist[v] = costNoOrder
					heap.Push(pq, &Item{node: v, cost: costNoOrder})
				}
			}
		}
	}

	
	fmt.Println("-1")
}