#include using namespace std; using ll = long long; using ld = long double; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() typedef pair pii; typedef vector vi; typedef vector vll; typedef pair ii; typedef vector vii; ll n, m, f, t, s; vector e; int main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); cin >> n>>m>>f>>t>>s; e = vector (n); rep(i, 0, m) { ll x, y; cin >> x >> y; e[y].push_back(x); e[x].push_back(y); } queue qT; vector> tDistance(n, vll(2, -1)); qT.push({t, 0}); tDistance[t][0] = 0; while(!qT.empty()) { auto cur = qT.front(); qT.pop(); ll nextParity = (cur.second + 1 )%2; for(auto neigh : e[cur.first]) { if(tDistance[neigh][nextParity] != -1) continue; tDistance[neigh][nextParity] = cur.second +1; qT.push({neigh, cur.second +1}); } } vector> sDistance(n, vll(2, -1)); queue qS; qS.push({s, 0}); sDistance[s][0]= 0; while(!qS.empty()) { auto cur = qS.front(); qS.pop(); if(cur.first == f) { cout << cur.second << endl; return 0; } ll nextParity = (cur.second + 1 )%2; for(auto neigh : e[cur.first]) { if(sDistance[neigh][nextParity] != -1) continue; if(tDistance[neigh][nextParity] != -1 && tDistance[neigh][nextParity] <= cur.second + 1) continue; sDistance[neigh][nextParity] = cur.second + 1; qS.push({neigh, cur.second +1}); } { if(sDistance[cur.first][nextParity] != -1) continue; if(tDistance[cur.first][nextParity] != -1 && tDistance[cur.first][nextParity] <= cur.second+1) continue; sDistance[cur.first][nextParity] = cur.second + 1; qS.push({cur.first, cur.second +1}); } } cout << "death" << endl; }