Problem:
Score : 500 points

Problem Statement

Ken loves ken-ken-pa (Japanese version of hopscotch). Today, he will play it on a directed graph G.
G consists of N vertices numbered 1 to N, and M edges. The i-th edge points from Vertex u_i to Vertex v_i.

First, Ken stands on Vertex S. He wants to reach Vertex T by repeating ken-ken-pa. In one ken-ken-pa, he does the following exactly three times: follow an edge pointing from the vertex on which he is standing.

Determine if he can reach Vertex T by repeating ken-ken-pa. If the answer is yes, find the minimum number of ken-ken-pa needed to reach Vertex T. Note that visiting Vertex T in the middle of a ken-ken-pa does not count as reaching Vertex T by repeating ken-ken-pa.

Constraints

2 \leq N \leq 10^5

0 \leq M \leq \min(10^5, N (N-1))

1 \leq u_i, v_i \leq N(1 \leq i \leq M)

u_i \neq v_i (1 \leq i \leq M)

If i \neq j, (u_i, v_i) \neq (u_j, v_j).

1 \leq S, T \leq N

S \neq T

Input

Input is given from Standard Input in the following format:

N M
u_1 v_1
:
u_M v_M
S T

Output

If Ken cannot reach Vertex T from Vertex S by repeating ken-ken-pa, print -1.
If he can, print the minimum number of ken-ken-pa needed to reach vertex T.

Sample Input 1

4 4
1 2
2 3
3 4
4 1
1 3

Sample Output 1

2

Ken can reach Vertex 3 from Vertex 1 in two ken-ken-pa, as follows: 1 \rightarrow 2 \rightarrow 3 \rightarrow 4 in the first ken-ken-pa, then 4 \rightarrow 1 \rightarrow 2 \rightarrow 3 in the second ken-ken-pa. This is the minimum number of ken-ken-pa needed.

Sample Input 2

3 3
1 2
2 3
3 1
1 2

Sample Output 2

-1

Any number of ken-ken-pa will bring Ken back to Vertex 1, so he cannot reach Vertex 2, though he can pass through it in the middle of a ken-ken-pa.

Sample Input 3

2 0
1 2

Sample Output 3

-1

Vertex S and Vertex T may be disconnected.

Sample Input 4

6 8
1 2
2 3
3 4
4 5
5 1
1 4
1 5
4 6
1 6

Sample Output 4

2

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)

    import java.io.*;
    import java.util.*;
    public class Main {
    	
    	static final int INF = Integer.MAX_VALUE;
    	static PriorityQueue<Vertex> pq = new PriorityQueue<>();
    	static boolean[] visited;
    	static Vertex[] vs;
    	
    	static class Vertex implements Comparable<Vertex> {
    		int index;
    		int shortestDist;
    		ArrayList<Integer> adj;
    		boolean[] used = new boolean[4];
    		
    		public Vertex(int i) {
    			index = i;
    			shortestDist = INF;
    			adj = new ArrayList<>();
    		}
    		
    		public int compareTo(Vertex v) {
    			return Integer.compare(shortestDist, v.shortestDist);
    		}
    		
    //		public String toString() {
    //			return "" + index + " " + shortestDist;
    //		}
    	}
    	
    	public static void main(String[] args) {
    		InputReader in = new InputReader();
    		int n = in.nextInt();
    		int m = in.nextInt();
    		
    		vs = new Vertex[n];
    		for (int i=0; i<n; i++)
    			vs[i] = new Vertex(i);
    		
    		for (int i=0; i<m; i++) {
    			int u = in.nextInt() - 1;
    			int v = in.nextInt() - 1;
    			vs[u].adj.add(v);
    		}
    		int s = in.nextInt() - 1, t = in.nextInt() - 1;
    		
    		visited = new boolean[n];
    		visited[s] = true;
    		vs[s].shortestDist = 0;
    		pq.add(vs[s]);
    		
    		while (!pq.isEmpty() && !visited[t]) {
    			Vertex v = pq.poll();
    			dijkstra(v.index, v.index, 0);
    		}
    		
    		System.out.println(vs[t].shortestDist == INF ? -1 : vs[t].shortestDist);
    		
    	}
    	
    	public static void dijkstra(int cur, int start, int dist) {
    		if (dist == 3) {
    			if (!visited[cur]) {
    				visited[cur] = true;
    				vs[cur].shortestDist = vs[start].shortestDist + 1;
    				pq.add(vs[cur]);
    			}
    			return;
    		}
    		if (!vs[cur].used[dist]) {
    			vs[cur].used[dist] = true;
    			for (int i: vs[cur].adj) {
    				dijkstra(i, start, dist+1);
    				vs[i].used[dist+1] = true;
    			}
    		}
    		
    	}
     
    	static class InputReader {
    		public BufferedReader br;
    		public StringTokenizer st;
    		
    		public InputReader() {
    			br = new BufferedReader(new InputStreamReader(System.in));
    			st = null;
    		}
    		
    		public String next() {
    			while (st == null || !st.hasMoreTokens()) {
    				try {
    					st = new StringTokenizer(br.readLine());
    				}
    				catch (IOException e) {
    					throw new RuntimeException(e);
    				}
    			}
    			return st.nextToken();
    		}
    		
    		public int nextInt() {
    			return Integer.parseInt(next());
    		}
    	}
    }