Problem: Fox Jiro is one of the staffs of the ACM-ICPC 2018 Asia Yokohama Regional Contest and is responsible for designing the network for the venue of the contest. His network consists of $N$ computers, which are connected by $M$ cables. The $i$-th cable connects the $a_i$-th computer and the $b_i$-th computer, and it carries data in both directions. Your team will use the $S$-th computer in the contest, and a judge server is the $T$-th computer.

He decided to adjust the routing algorithm of the network to maximize the performance of the contestants through the magical power of prime numbers. In this algorithm, a packet (a unit of data carried by the network) is sent from your computer to the judge server passing through the cables a prime number of times if possible. If it is impossible, the contestants cannot benefit by the magical power of prime numbers. To accomplish this target, a packet is allowed to pass through the same cable multiple times.

You decided to write a program to calculate the minimum number of times a packet from $S$ to $T$ needed to pass through the cables. If the number of times a packet passes through the cables cannot be a prime number, print $-1$.



Input

The input consists of a single test case, formatted as follows.


$N$ $M$ $S$ $T$
$a_1$ $b_1$
$\vdots$
$a_M$ $b_M$


The first line consists of four integers $N, M, S,$ and $T$ ($2 \leq N \leq 10^5, 1 \leq M \leq 10^5, 1 \leq S, T \leq N, S \ne T$). The $i$-th line of the following $M$ lines consists of two integers $a_i$ and $b_i$ ($1 \leq a_i < b_i \leq N$), which means the $i$-th cables connects the $a_i$-th computer and the $b_i$-th computer in the network. You can assume that the network satisfies the following conditions.

* The network has no multi-edge, i.e.,$(a_i, b_i) \ne (a_j, b_j)$ for all $i,j$ ($1 \leq i < j \leq M$).
* The packets from $N$ computers are reachable to $T$ by passing through some number of cables. The number is not necessarily a prime.

Output

If there are ways such that the number of times a packet sent from $S$ to $T$ passes through the cables is a prime number, print the minimum prime number of times in one line. Otherwise, print $-1$.

Examples

Input

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


Output

3


Input

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


Output

-1


Input

2 1 1 2
1 2


Output

3


Input

3 3 1 2
1 2
1 3
2 3


Output

2

Solution (in CPP):

Solution:
#include <iostream>
#include <vector>
#include <queue>
#include <tuple>
#include <set>
using namespace std;
using llong = long long;

llong n, m, s, t;
vector<vector<llong>> g;
vector<llong> min_cost[2];
vector<llong> is_prime;
set<llong> st;

void bfs() {
		min_cost[0].resize(n + 1, -1);
		min_cost[1].resize(n + 1, -1);

		queue<pair<llong, llong>> que;
		que.push(make_pair(0, s));
		min_cost[0][s] = 0;

		while (!que.empty()) {
				auto state = que.front();
				llong pos = state.second;
				llong is_odd = state.first;
				que.pop();

				for (auto v:g[pos]) {
						llong npos = v;
						llong ncost = min_cost[is_odd][pos] + 1;

						if (min_cost[is_odd ^ 1][npos] == -1) {
								min_cost[is_odd ^ 1][npos] = min_cost[is_odd][pos] + 1;
								que.push(make_pair(is_odd ^ 1, npos));
						}
				}
		}
}

void f() {
		is_prime.resize(200001, 0);
		for (int i = 2; i <= 200000; i++) {
				if (is_prime[i] == 0) {
						for (int j = i + i; j <= 200000; j += i) {
								is_prime[j] = 1;
						}
						st.insert(i);
				}
		}
		st.insert(-1);
}

int main() {
		f();

		cin >> n >> m >> s >> t;
		g.resize(n + 1, vector<llong>());

		for (int i = 0; i < m; i++) {
				llong a, b;
				cin >> a >> b;
				g[a].push_back(b);
				g[b].push_back(a);
		}

		bfs();

		if (min_cost[0][t] == 2) {
				cout << 2 << endl;
				return 0;
		}

		if (min_cost[1][t] == 1) cout << 3 << endl;
		else cout << *(st.lower_bound(min_cost[1][t])) << endl;

		return 0;
}