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 C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class MainClass
{
	public const long Giri = 1000000007;
	public const long DpInf = 99999999999999;
	
	public class Node
	{
		public int Index{get;set;}
		public List<int> Edges{get;set;}
		public int Distance{get;set;}
		public int[] Kenpa {get;set;}
	}
	
	public class Obj
	{
		public int Index{get;set;}
		public int Count{get;set;}
		public int Ken{get;set;}
	}
	public static void Main(string[] args)
	{
		var p = Input().ToInt();
		var n = p[0];
		var m = p[1];
		
		var nodes = new Node[n];
		for(int i = 0; i < n; i++)
			nodes[i] = new Node(){Index=i, Edges=new List<int>(), Distance = -1, Kenpa = new int[]{-1,-1,-1}};
		
		for(int i = 0; i < m; i++)
		{
			p = Input().ToInt(-1);
			nodes[p[0]].Edges.Add(p[1]);
		}
		
		p = Input().ToInt(-1);
		var s = p[0];
		var t = p[1];

		var q = new Queue<Obj>();
		q.Enqueue(new Obj(){Index=s});
		
		while(q.Count > 0)
		{
			var obj = q.Dequeue();
			var index = obj.Index;
			var ken = obj.Ken;
			var cnt = obj.Count;
			bool cont = false;
			for(int i = 0; i < 3; i++)
			{
				if(nodes[index].Kenpa[i] != -1 && ken == i && nodes[index].Kenpa[i] <= cnt)
				{
					cont = true;
					break;
				}
			}
			if(cont) continue;
			
			nodes[index].Kenpa[ken] = cnt;
			foreach(var e in nodes[index].Edges)
			{
				//BFS(nodes, e, ken == 0 ? (cnt+1) : cnt, (ken +1) % 3);
				q.Enqueue(new Obj(){Index = e, Count = (ken == 0 ? (cnt+1) : cnt), Ken = (ken+1) % 3});
			}
		}

		Console.WriteLine(nodes[t].Kenpa[0]);
	}
	

	
	static long GCD(long a, long b)
	{
		var v = new[] { a, b };
		while (v[1] != 0) { v = new[] { v[1], v[0] % v[1] }; }
		return v[0];
	}
	public static string[] Input() { return Console.ReadLine().Split(); }
}

public static class Smarter
{
	public static int ToInt(this string str) { return int.Parse(str); }
	public static long ToLong(this string str) { return long.Parse(str); }
	public static int[] ToInt(this string[] str, int offset = 0)
	{
		var r = new int[str.Length];
		for(int i = 0; i < str.Length; i++) r[i] = str[i].ToInt() + offset;
		return r;
	}
}