#include using namespace std; typedef long long ll; const int maxn = 1e5 + 5; #define pb push_back int P[maxn], S[maxn]; vector> nodes; vector>> edges; int Find(int x) { if(x==P[x]) return x; return P[x]=Find(P[x]); } bool Union(pair e) { int fa = Find(e.first), fb=Find(e.second); if(fa==fb) return false; if(S[fa]>S[fb]) { P[fb] = fa; S[fa] += S[fb]; } else { P[fa] = fb; S[fb] += S[fa]; } return true; } int solve(int x) { for(auto v:nodes[x]) {P[v]=v; S[v]=1;} int scnt = nodes[x].size(); for(auto e:edges[x]) if(Union(e)) scnt--; return scnt; } int main(){ ios_base::sync_with_stdio(0); cout.tie(0); cin.tie(0); int n, e, p; cin>>n>>e>>p; vector> ed(e); for(int i=0; i>ed[i].first>>ed[i].second; vector> s(n+1); nodes.resize(p); edges.resize(p); for(int i=0; i>k; nodes[i].resize(k); for(int j=0; j>x; nodes[i][j]=x; s[x].insert(i); } } for(auto edge: ed) { int a = edge.first, b=edge.second; if(s[a].size() > s[b].size()) swap(a,b); for(auto x : s[a]) if(s[b].find(x)!=s[b].end()) edges[x].pb(edge); } for(int i=0; i