#include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m, k; cin >> n >> m >> k; if (k == 0) { cout << "Yes" << endl; return 0; } struct Edge { int u, v; }; vector edges(m); vector> X(n + 1); for (int i = 0; i < m; ++i) { cin >> edges[i].u >> edges[i].v; X[edges[i].u].push_back(edges[i].v); } vector dist(n + 1, -1); queue q; dist[1] = 0; q.push(1); while (!q.empty()) { int u = q.front(); q.pop(); for (int v : X[u]) { if (dist[v] == -1) { dist[v] = dist[u] + 1; q.push(v); } } } for (int i = 1; i <= n; ++i) { if (dist[i] == -1) { cout << "No" << endl; return 0; } } vector g(n + 1, 0); for (const auto& edge : edges) { long long diff = abs(dist[edge.v] - (dist[edge.u] + 1)); if (diff > 0) { g[edge.v] = gcd(g[edge.v], diff); } } q.push(1); // vector ok(n + 1, false); for(int i=1; i<=n; i++) q.push(i); while (!q.empty()) { int u = q.front(); q.pop(); for (int v : X[u]) { long long nxt = gcd(g[v], g[u]); if (nxt != g[v]) { g[v] = nxt; q.push(v); } } } for (int i = 1; i <= n; ++i) { for (int b = 0; b < k; ++b) { long long mod = 1LL << (b + 1); long long tar = 1LL << b; long long P = gcd(g[i], mod); bool ok = false; if ((dist[i] % mod) >= tar) { ok = true; } else if (P > 0 && P <= tar) { ok = true; } if (!ok) { cout << "No" << endl; return 0; } } } cout << "Yes" << endl; return 0; }