#include <bits/stdc++.h>
using namespace std;

#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(a) max((a),-(a))

typedef long long LL;
typedef long long ll;
typedef pair<int,int> P;
#define rep(i,n) for(int i=0;i<n;i++)
#define Rep(i,sta,n) for(int i=sta;i<n;i++)

const ll mod=1000000007;
const ll INF=mod*mod;

vector<int> v;
bool isp[200000];
void init(){
  fill(isp+2,isp+200000,true);
  for(int i=3;i<200000;i++){
    if(!isp[i])continue;
    v.push_back(i);
    for(int j=2*i;j<200000;j+=i){
      isp[j]=false;
    }
  }
}
vector<int> G[100000];
int used[100000][2];
int main(){
  init();
  int n,m,s,g;cin>>n>>m>>s>>g;s--;g--;
  rep(i,m){
    int a,b;cin>>a>>b;a--;b--;G[a].push_back(b);G[b].push_back(a);
  }
  queue<int> q;q.push(s);
  int out=1000000;
  int cnt=0;
  while(!q.empty()){
    int t=cnt%2;
    int len=q.size();
    rep(i,len){
      int x=q.front();q.pop();
      used[x][t]=1;
      int l=G[x].size();
      rep(j,l){
        int nex=G[x][j];
        if(used[nex][t^1])continue;
        used[nex][t^1]=true;q.push(nex);
        if(cnt+1==2&&nex==g){
          out=min(out,2);
        }
        if(cnt%2==0&&nex==g){
          int le=lower_bound(v.begin(),v.end(),cnt+1)-v.begin();
          out=min(out,v[le]);
        }
      }
    }
    cnt++;
  }
  if(out==1000000)out=-1;
  cout<<out<<endl;
  return 0;
}

