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 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<stdio.h>
#include<stdlib.h>
int u[100005], v[100005];
int asc(const void* a, const void* b)
{
	return u[*(int*)a] - u[*(int*)b];
}
int main()
{
	int n, m;
	scanf("%d %d", &n, &m);
	if (m < 2)
	{
		printf("-1\n");
		return 0;
	}
	int i, j;
	for (i = 0; i < m; i++)
	{
		scanf("%d %d", &u[i], &v[i]);
		u[i]--;
		v[i]--;
	}
	int s, t;
	scanf("%d %d", &s, &t);
	s--;
	t--;
	int c[100005];
	for (i = 0; i < m; i++)
		c[i] = i;
	qsort(c, m, sizeof(int), asc);
	int min, max, mid;
	int d[2][100005];
	for (i = 0; i < n; i++)
		d[0][i] = -1;
	d[0][s] = 0;
	for (i = 0; i < 104; i++)
	{
		for (j = 0; j < n; j++)
		{
			if (d[0][j] == i)
			{
				min = 0;
				max = m - 1;
				while (max - min > 1)
				{
					mid = (max + min) / 2;
					if (u[c[mid]] < j)
						min = mid;
					else
						max = mid;
				}
				if (u[c[min]] < j)
					min++;
				while (u[c[min]] == j)
				{
					d[1][v[c[min]]] = i + 1;
					min++;
					if (min == m)
						break;
				}
			}
		}
		for (j = 0; j < n; j++)
			if (d[1][j] == i + 1)
				d[0][j] = i + 1;
		if (d[0][t] % 3 == 0)
		{
			printf("%d\n", (i + 1) / 3);
			return 0;
		}
	}
	printf("-1\n");
	return 0;
}