#include #include #include #include #include #include #include #include #include using namespace std; #pragma warning (disable: 4996) long long N, M, P, S, G; long long A[1 << 18], B[1 << 18]; long long dist[1 << 18][2]; long long dist1[1 << 18][2], dist2[1 << 18][2]; vector X[1 << 18]; void solve(int stt) { for (int i = 1; i <= N; i++) { dist[i][0] = (1 << 30); dist[i][1] = (1 << 30); } queue> Q; Q.push(make_pair(stt, 0)); dist[stt][0] = 0; while (!Q.empty()) { int pos1 = Q.front().first; int pos2 = Q.front().second; Q.pop(); for (int i : X[pos1]) { if (dist[i][pos2 ^ 1] > dist[pos1][pos2] + 1) { dist[i][pos2 ^ 1] = dist[pos1][pos2] + 1; Q.push(make_pair(i, (pos2 ^ 1))); } } } } int main() { cin >> N >> M >> P >> S >> G; for (int i = 1; i <= M; i++) { cin >> A[i] >> B[i]; X[A[i]].push_back(B[i]); X[B[i]].push_back(A[i]); } // 最短距離 solve(S); for (int i = 1; i <= N; i++) { dist1[i][0] = dist[i][0]; dist1[i][1] = dist[i][1]; } solve(G); for (int i = 1; i <= N; i++) { dist2[i][0] = dist[i][0]; dist2[i][1] = dist[i][1]; } // 判定 vector vec; for (int i = 1; i <= N; i++) { long long min_value = (1 << 30); if (P % 2 == 0) { min_value = min(min_value, dist1[i][0] + dist2[i][0]); min_value = min(min_value, dist1[i][1] + dist2[i][1]); } if (P % 2 == 1) { min_value = min(min_value, dist1[i][0] + dist2[i][1]); min_value = min(min_value, dist1[i][1] + dist2[i][0]); } if (min_value <= P) vec.push_back(i); } // 出力 if (vec.size() == 0) { cout << "-1" << endl; } else { cout << vec.size() << endl; for (int i = 0; i < vec.size(); i++) cout << vec[i] << endl; } return 0; }