#include #include using namespace std; using namespace atcoder; #define ll long long #define rep(i,a,b) for(int i=(a);i<(b);i++) #define repl(i,a,b) for(ll i=(a);i<(b);i++) #define all(a) (a).begin(),(a).end() #define rall(a) (a).rbegin(),(a).rend() template bool chmin(T &a,T b){if(a>b){a=b;return true;} return false;} template bool chmax(T &a,T b){if(a> n >> m >> s >> g; s--,g--; vector> to(n); vector> edge; rep(i,0,m){ int u,v; cin >> u >> v; u--,v--; to[u].push_back(v); to[v].push_back(u); edge.push_back({u,v}); } vector ord(n,-1),low(n); int num=0; auto dfs=[&](auto dfs,int pr,int v) -> void{ ord[v]=num; num++; low[v]=ord[v]; for(auto nv:to[v]){ if(nv == pr || ord[nv] == -1) continue; chmin(low[v],ord[nv]); } for(auto nv:to[v]){ if(nv == pr || ord[nv] != -1) continue; dfs(dfs,v,nv); chmin(low[v],low[nv]); } }; dfs(dfs,-1,s); // rep(i,0,n){ // cout << ord[i] << " " << low[i] << '\n'; // } vector>> G(n); rep(i,0,m){ auto [u,v]=edge[i]; if(ord[u]>ord[v]) swap(u,v); if(ord[u] dist(n,INF); queue que; que.push(g); dist[g]=0; while(!que.empty()){ auto v=que.front(); que.pop(); for(auto nv:to[v]){ if(chmin(dist[nv],dist[v]+1)) que.push(nv); } } if(dist[s] == INF){ cout << -1 << '\n'; return 0; } deque dq; dq.push_back(s); vector d(n,INF); d[s]=0; while(!dq.empty()){ auto v=dq.front(); dq.pop_front(); for(auto [nv,cost]:G[v]){ if(dist[nv] != dist[v]-1) continue; if(cost == 0){ if(chmin(d[nv],d[v])) dq.push_front(nv); } else{ if(chmin(d[nv],d[v]+1)) dq.push_back(nv); } } } cout << dist[s]-d[g] << '\n'; }