// #define _GLIBCXX_DEBUG // for STL debug (optional) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long int; using int64 = long long int; template void chmax(T &a, T b) {a = max(a, b);} template void chmin(T &a, T b) {a = min(a, b);} template void chadd(T &a, T b) {a = a + b;} int dx[] = {0, 0, 1, -1}; int dy[] = {1, -1, 0, 0}; const int INF = 1LL << 29; const ll LONGINF = 1LL << 60; const ll MOD = 1000000007LL; ll dp[2010][2][2]; int main() { int N, M, K, s, t; cin >> N >> M >> K >> s >> t; s--, t--; vector> G(N); for(int i=0; i> u >> v; u--, v--; G[u].emplace_back(v); G[v].emplace_back(u); } fill(dp[0][0], dp[N][0], LONGINF); dp[s][0][0] = 0; queue> que; que.emplace(s, 0, 0); while(que.size()) { auto [i, p, is_used] = que.front(); que.pop(); for(int j : G[i]) { if (dp[j][p^1][is_used] > dp[i][p][is_used] + 1) { dp[j][p^1][is_used] = dp[i][p][is_used] + 1; que.emplace(j, p^1, is_used); } } for(int j=0; !is_used && j dp[i][p][is_used] + 1) { dp[j][p^1][true] = dp[i][p][is_used] + 1; que.emplace(j, p^1, true); } } } bool is_ok = false; fprintf(stderr, "debug: dp1 = %lld, dp2 = %lld\n", dp[t][0][true], dp[t][1][true]); is_ok |= K % 2 == 0 && dp[t][0][true] <= K; is_ok |= K % 2 == 1 && dp[t][1][true] <= K; cout << (is_ok ? "Yes" : "No") << endl; return 0; }