#include using namespace std; using ll = long long; const ll INF = 1ll << 60; #define REP(i, n) for(ll i =0; i < ll(n); i++) template using V = vector; template bool chmax(A& a, B b) { return a bool chmin(A& a, B b) { return b> scc(int n, V> g){ int tm = 0, it = 0, idx = 0; V ord(n, -1), st(n + 1, n), id(n, n); auto dfs = [&](auto& dfs, int v) -> int { int low = ord[v] = tm++; st[it++] = v; for (auto w : g[v]) if(id[w] >= n) chmin(low, ord[w] < 0 ? dfs(dfs, w) : ord[w]); if (low == ord[v] && ++idx) while(st[it] != v) id[st[--it]] = idx; return low; }; REP(i, n) if (ord[i] == -1) dfs(dfs, i); for(auto& x : id) x = idx - x; return make_pair(idx, move(id)); } void testcase() { int n, m, k; cin >> n >> m >> k; V> g(n); REP(i, m) { int u, v; cin >> u >> v; u--; v--; g[u].push_back(v); } auto [sz, gid] = scc(n, g); V> groups(sz); REP(u, n) { groups[gid[u]].push_back(u); for(int v : g[u]) { if(gid[u] == gid[v]) continue; if(gid[u]+1 == gid[v]) continue; cout << "No\n"; return; } } V odd(sz); V> seen(2, V(n)); REP(gi, sz) { int st = groups[gi][0]; stack> stk; seen[0][st] = 1; stk.emplace(0, st); while(!stk.empty()) { auto [d, u] = stk.top(); stk.pop(); for(int v : g[u]) { if(gid[u] != gid[v]) continue; if(seen[d^1][v]) continue; seen[d^1][v] = 1; stk.emplace(d^1, v); } } odd[gi] = seen[1][st]; if(odd[gi]) continue; if(gi > 0 && k == 1 && odd[gi-1]) continue; cout << "No\n"; return; } cout << "Yes\n"; } int main() { cin.tie(0)->sync_with_stdio(0); testcase(); }