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

const long long MaxN = 1e5 + 5;
const long long MaxVal = 1e18;

long long n,m,a,b;

vector<long long> arr[MaxN];

bool Check_A[2][MaxN];
bool Check_B[2][MaxN];

long long Min_SumA[2][MaxN];
long long Min_SumB[2][MaxN];

void bfs(long long x, vector<long long> arr[], bool Check[2][MaxN], long long Min_Sum[2][MaxN])
{
    queue<pair<long long,long long>> qu;

    qu.push({x,0});

    Check[0][x]=true;
    Min_Sum[0][x]=0;

    while(!qu.empty())
    {
        long long u=qu.front().first;
        long long parity=qu.front().second;
        qu.pop();

        long long new_dis=Min_Sum[parity][u]+1;
        long long new_parity=1-parity;

        for(long long v:arr[u])
        {
            if(!Check[new_parity][v])
            {
                Check[new_parity][v]=true;
                Min_Sum[new_parity][v]=new_dis;

                qu.push({v,new_parity});
            }
        }
    }
}

void input()
{
    cin>>n>>m;
    cin>>a>>b;

    for(long long i=1;i<=m;i++)
    {
        long long u,v;

        cin>>u>>v;

        arr[u].push_back(v);
        arr[v].push_back(u);
    }
}

void solve()
{
    for(long long i=1;i<=n;i++)
    {
        for(long long j=0;j<=1;j++)
        {
            Check_A[j][i]=false;
            Check_B[j][i]=false;

            Min_SumA[j][i]=MaxVal;
            Min_SumB[j][i]=MaxVal;
        }
    }

    bfs(a,arr,Check_A,Min_SumA);
    bfs(b,arr,Check_B,Min_SumB);

    long long ans=MaxVal;

    for(long long i=1;i<=n;i++)
    {
        for(long long j=0;j<=1;j++)
        {
            if(Check_A[j][i] && Check_B[j][i])
            {
                ans=min(ans,max(Min_SumA[j][i],Min_SumB[j][i]));
            }
        }
    }

    if(ans==MaxVal)
    {
        cout<<-1;
    }
    else
    {
        cout<<ans;
    }
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    input();
    solve();
}
