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++14 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include <queue>
#include <cstdio>
#include <iostream>
#include <math.h>
#include <set>
#include <map>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
#include <iomanip>
#include <stack>
using namespace std;
typedef long long int ll;

#define EPS (1e-9)
#define INF (1e9)
#define PI (acos(-1))
#define REP(i,n) for(int i=0;i<n;i++)
const int MOD = 1000000007;

int gcd(int a, int b) {
	if (b == 0) return a;
	return gcd(b, a % b);
}

int e[100010] = {};
int s, t;

using Graph = vector<vector<int>>;

// 深さ優先探索
vector<bool> seen;
void dfs(const Graph& G, int v, int c, int d) {
	if (c == 3) {
		seen[v] = true; // v を訪問済にする
		c = 0;
		d++;
		if (e[v] != 0) e[v] = min(d, e[v]);
		else e[v] = d;
	}

//	cout << "v" << v << endl;
//	cout << "seen:" << seen[v] << endl;
//	cout << "c" << c << "d" << d << endl;
//	cout << endl;

	// v から行ける各頂点 next_v について
	for (auto next_v : G[v]) {
		if (seen[next_v] && c == 2 && e[next_v] < d + 1) continue; // next_v が探索済だったらスルー
		dfs(G, next_v, c + 1, d); // 再帰的に探索
	}
}

int main() {
	// 頂点数と辺数、s と t
	int N, M;
	cin >> N >> M;

//	cout << "うけとり" << endl;

	// グラフ入力受取
	Graph G(N);
	for (int i = 0; i < M; ++i) {
		int a, b;
		cin >> a >> b;
		G[a - 1].push_back(b - 1);
	}
	
	cin >> s >> t;

	// 頂点 s をスタートとした探索
	seen.assign(N, false); // 全頂点を「未訪問」に初期化
	dfs(G, s - 1, 0, 0);

	// t に辿り着けるかどうか
	if (seen[t - 1]) {
//		cout << "Yes" << endl;
		cout << e[t - 1] << endl;
	}
	else {
//		cout << "No" << endl;
		cout << -1 << endl;
	}
}