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 <algorithm>
#include <queue>
using namespace std;
using ll = long long int;

const ll INF = 1LL << 60;
ll dist[100010][2];
vector<int> G[100010];

struct Elem {
  int cur, mod2;
  ll distance;
  Elem(int a, int b, ll c) : cur(a), mod2(b), distance(c) {}
  bool operator<(const Elem& e) const {
    return distance > e.distance;
  }
};

const int SIZE = 2000010;
vector<int> get_primes() {
  vector<int> is_prime(SIZE+10, 1);
  for(int i=2; i<SIZE; i++) {
    if(is_prime[i] == false) continue;
    for(int k=2*i; k<SIZE; k+=i) {
      is_prime[k] = false;
    }
  }

  vector<int> res;
  for(int i=3; i<SIZE; i++) {
    if(is_prime[i] == true) {
      // if(i < 100) cerr << i << endl;
      res.push_back(i);
    }
  }
  return res;
}

int main() {
  vector<int> primes = get_primes();

  int N, M, S, T; cin >> N >> M >> S >> T;
  fill(dist[0], dist[N], INF);
  for(int i=0; i<M; i++) {
    int u, v; cin >> u >> v;
    u--; v--;
    G[u].push_back(v);
    G[v].push_back(u);
  }

  S--; T--;
  dist[S][0] = 0;
  priority_queue<Elem> que;
  que.push(Elem{S, 0, 0});
  while(que.size()) {
    Elem e = que.top(); que.pop();
    int pos = e.cur, mo = e.mod2;
    ll di = e.distance;
    if(dist[pos][mo] < di) continue;
    for(auto to : G[pos]) {
      int nmod = 1 - mo;
      int ndi = e.distance + 1;
      if(dist[to][nmod] > ndi) {
	dist[to][nmod] = ndi;
	que.push(Elem{to, nmod, ndi});
      }
    }
  }

  if(dist[T][0] == 2) cout << 2 << endl;
  else {
    auto it = lower_bound(primes.begin(), primes.end(), dist[T][1]);
    if(it == primes.end()) cout << -1 << endl;
    else cout << *it << endl;
  }
  return 0;
}