#include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; #define int long long #define double long double typedef vector VI; typedef pair pii; typedef vector VP; typedef vector VS; typedef priority_queue PQ; templatebool chmax(T &a, const T &b) { if (a < b) { a = b; return 1; } return 0; } templatebool chmin(T &a, const T &b) { if (b < a) { a = b; return 1; } return 0; } #define fore(i,a) for(auto &i:a) #define REP(i,n) for(int i=0;i, greater > q2; int N, M, P, s, g; vector G; int dp1[100010][2]; int dp2[100010][2]; signed main() { cin.tie(0); ios::sync_with_stdio(false); cin >> N >> M >> P >> s >> g; G.resize(N); s--; g--; REP(i, M) { int v, u; cin >> u >> v; u--; v--; G[v].push_back(u); G[u].push_back(v); } REP(i, N) dp1[i][0] = dp1[i][1] = dp2[i][0] = dp2[i][1] = INF; queueQ; Q.push(s); dp1[s][0] = 0; while (!Q.empty()) { int now = Q.front(); Q.pop(); //cout << now << endl; fore(to,G[now]) { bool F = false;//pushするか if (dp1[now][0] + 1 < dp1[to][1]) { dp1[to][1] = dp1[now][0] + 1; F = true; } if (dp1[now][1] + 1 < dp1[to][0]) { dp1[to][0] = dp1[now][1] + 1; F = true; } if (F)Q.push(to); } } Q.push(g); dp2[g][0] = 0; while (!Q.empty()) { int now = Q.front(); Q.pop(); fore(to, G[now]) { bool F = false;//pushするか if (dp2[now][0] + 1 < dp2[to][1]) { dp2[to][1] = dp2[now][0] + 1; F = true; } if (dp2[now][1] + 1 < dp2[to][0]) { dp2[to][0] = dp2[now][1] + 1; F = true; } if (F)Q.push(to); } } REP(i, N) { //cout << dp1[i][0] << " " << dp1[i][1] << " " << dp2[i][0] << " " << dp2[i][1] << endl; } VI ans; REP(i, N) { bool F = false;//pushできるか REP(j, 2)REP(k, 2) { if ((P >= dp1[i][j] + dp2[i][k]) && ((P - dp1[i][j] - dp2[i][k]) % 2 == 0)) { F = true; } } if (F)ans.push_back(i); } if (ans.size() == 0) { cout << -1 << endl; return 0; } SORT(ans); cout << ans.size() << endl; fore(i, ans)cout << i + 1 << '\n'; return 0; }