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<bits/stdc++.h>
using namespace std;

#define ll long long
#define rep(i,a,n) for(ll i=a;i<=n;i++)
#define rop(i,n) for(ll i=0;i<n;i++)
#define pb push_back
#define pob pop_back
#define pf push_front
#define pis pair<int, string>
#define pof pop_front
#define pii pair<int,int>
#define pll pair<ll, ll>
#define mp make_pair
#define fi first
#define se second
#define endl '\n'

const int dr[]={-1,1,0,0};
const int dc[]={0,0,1,-1};
const int drd[]={-1,-1,1,1};
const int dcd[]={-1,1,-1,1};
const int MOD = 1e9 + 7;
const int INF = 1e9;
const int MAX = 1e5 + 5;
const double phi= acos(-1);

bool isPrime[1000005];
bool vis[1000005];
void sieve()
{
	rep(i,2,1000003)
	{
		if(vis[i]) continue;
		isPrime[i]=1;
		vis[i]=1;
		for(int j=i;j<=1000003;j+=i)
		{
			vis[j]=1;
		}
	}
}
int n,m,s,t,a,b;
vector <int> lst[MAX];
queue <int> q;
pii dis[MAX];
int vis1, vis2;
int main()
{
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//	freopen("input.txt","r",stdin);
//	freopen("output.txt","w",stdout);
	sieve();
	cin>>n>>m>>s>>t;
	rep(i,1,n) dis[i]={INF,INF};
	rep(i,1,m)
	{
		cin>>a>>b;
		lst[a].pb(b);
		lst[b].pb(a);
	}
	q.push(s);
	dis[s]={0,0};
	while(!q.empty())
	{
		int tmp=q.front();
		q.pop();
		int sz=lst[tmp].size();
		rop(i,sz)
		{		
			if(dis[tmp].fi+1 < dis[lst[tmp][i]].se) 
			{
				q.push(lst[tmp][i]);
				dis[lst[tmp][i]].se=dis[tmp].fi+1;	
			}
			else if(dis[tmp].se+1 < dis[lst[tmp][i]].fi) 
			{
				q.push(lst[tmp][i]);
				dis[lst[tmp][i]].fi=dis[tmp].se+1;	
			}
			
		}
	}
	if(dis[t].se!=INF)
	{
		while(isPrime[dis[t].se]==0) dis[t].se+=2;
	}
	if(dis[t].fi==2)
	{
		cout<<2<<endl;
	}
	if(dis[t].fi!=2)
	{
		if(dis[t].se!=INF) cout<<dis[t].se<<endl;
		else cout<<-1<<endl;
	}
	return 0;
}