#include using namespace std; struct Visited { int odd = INT_MAX; int even = INT_MAX; int& at(int n) { if (n%2) return odd; return even; } } good[10000], evil[10000]; struct Qpoint { int ix; int dist; }; vector> descs; void go_in(queue &q, Visited &visp, int ix, int dist, bool vertical) { if (visp.at(++dist) == INT_MAX && (!vertical || evil[ix].at(dist) > dist)) { visp.at(dist) = dist; q.push({ix, dist}); } } void BFS(queue &q, Visited* vis, bool vertical) { while (q.size()) { Qpoint &qp = q.front(); int ix = qp.ix; int dist = qp.dist; q.pop(); for (auto d_ix : descs[ix]) { go_in(q, vis[d_ix], d_ix, dist, vertical); } if (vertical) { go_in(q, vis[ix], ix, dist, vertical); } } } int main() { ios::sync_with_stdio(false); int n, m, start, target, evil_start; cin >> n >> m >> target >> evil_start >> start; descs.resize(n); for (int i = 0; i < m; i++) { int a,b; cin >> a >> b; descs[a].push_back(b); descs[b].push_back(a); } good[start].even = 0; evil[evil_start].even = 0; queue q; q.push({evil_start, 0}); BFS(q, evil, false); q.push({start, 0}); BFS(q, good, true); if(start == evil_start) { cout << "death" << '\n'; return 0; } if (min(good[target].odd, good[target].even) == INT_MAX) cout << "death\n"; else cout << min(good[target].odd, good[target].even) << "\n"; return 0; }