#include <bits/stdc++.h>

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<vector<int>> descs;

void go_in(queue<Qpoint> &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<Qpoint> &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<Qpoint> q;
    q.push({evil_start, 0});
    BFS(q, evil, false);
    q.push({start, 0});
    BFS(q, good, true);

    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;
}