#include #include using namespace std; struct DSU { vector dsu; explicit DSU(int n) : dsu(n, -1) {} int find(int u) { return dsu[u] < 0 ? u : (dsu[u] = find(dsu[u])); } void merge(int u, int v) { u = find(u), v = find(v); if (u == v) return; if (dsu[u] > dsu[v]) swap(u, v); dsu[u] += dsu[v]; dsu[v] = u; } }; int main() { int n, m, k; cin >> n >> m >> k; vector> dg(n); DSU dsu{n}; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; dg[--u].push_back(--v); dsu.merge(u, v); } vector> groups(n); for (int i = 0; i < n; i++) { groups[dsu.find(i)].push_back(i); } int ret = 0; for (int i = 0; i < n; i++) { if (int(groups[i].size()) != k) continue; unordered_map cnt; for (auto elem : groups[i]) { for (auto neighbor : dg[elem]) { cnt[neighbor]++; } } bool valid = true; for (auto elem : groups[i]) { if (cnt[elem] != k - 1) { valid = false; break; } } if (valid) { ret++; } } cout << ret << '\n'; }