#include using namespace std; using ll=long long; using vi=vector; using vvi=vector; #define rep(i,n) for(int i=0;i> bridge, tmp; vector>> bc; // Biconnected Components に必要 LowLink(int n, vvi &g) : n(n), g(g), used(n, 0), ord(n), low(n), tps(n), par(n) { int k = 0; rep(i, n) if(used[i] == 0) k = dfs(i, -1, k); low2 = low; // 多重辺があるとき rep(i, n) { int v = tps[n - 1 - i]; bool flag = false; for(auto u : g[v]) { if(u == par[v] && !flag) { flag = true; continue; } if(low2[v] > low2[u]) low2[v] = low2[u]; } } }; int dfs(int v, int p, int k) { used[v] = 1; tps[k] = v; ord[v] = k++; low[v] = ord[v]; par[v] = p; bool flag = false; int c = 0; for(auto u : g[v]) { if(used[u] == 0) { c++; k = dfs(u, v, k); low[v] = min(low[v], low[u]); flag |= (p != -1) && (low[u] >= ord[v]); if(ord[v] < low[u]) bridge.push_back({v, u}); } else if(u != p) low[v] = min(low[v], ord[u]); } flag |= (p == -1 && c > 1); if(flag) art.push_back(v); return k; }; vvi TwoEdgeCC() { comp.assign(n, -1); int k = 0; rep(i, n) if(comp[i] == -1) dfs2(i, -1, k); vvi grp(k); rep(i, n) grp[comp[i]].push_back(i); return grp; } // Two-Edge-Connected Components に必要 void dfs2(int v, int p, int &k) { if(p >= 0 && ord[p] >= low2[v]) comp[v] = comp[p]; else comp[v] = k++; for(auto u : g[v]) { if(comp[u] == -1) dfs2(u, v, k); } } vector>> BiCC() { used.assign(n, 0); rep(i, n) if(!used[i]) dfs3(i, -1); return bc; } // Biconnected Components に必要 void dfs3(int v, int p) { used[v] = 1; for(auto u : g[v]) { if(u == p) continue; if(!used[u] || ord[u] < ord[v]) tmp.push_back(minmax(u, v)); if(!used[u]) { dfs3(u, v); if(low[u] >= ord[v]) { bc.emplace_back(); while(true) { auto e = tmp.back(); tmp.pop_back(); bc.back().push_back(e); if(e.first == min(u, v) && e.second == max(u, v)) break; } } } } } }; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); ll N,M,S,T; cin>>N>>M>>S>>T; S--;T--; vector> G(N); vector C(N,0); set> EF; for(ll i=0;i>u>>v; u--;v--; if(u>v)swap(u,v); G[u].push_back(v); G[v].push_back(u); EF.insert({u,v}); C[u]++; C[v]++; } LowLink LL(N,G); for(auto [u,v]:LL.bridge){ EF.erase({min(u,v),max(u,v)}); } queue Q; for(ll i=0;i D(N,INF); vector R(N,-1); D[S]=0; queue que; que.push(S); vector seen(N,0); while(!que.empty()){ ll n=que.front(); que.pop(); if(seen[n])continue; seen[n]=1; for(auto v:G[n]){ if(seen[v])continue; if(D[v]<=D[n]+1)continue; D[v]=D[n]+1; R[v]=n; que.push(v); } } if(D[T]>1e17)cout<<-1<<"\n"; else{ ll an=0; while(T!=S){ ll Y=R[T]; if(EF.count({min(Y,T),max(Y,T)}))an++; T=Y; } cout<