#pragma GCC optimize "O3" #include using namespace std; typedef long long ll; typedef pair ii; typedef vector vi; typedef vector vii; const int inf=0x3f3f3f3f; #define FOR(i,b,e) for(int i=b; i<=e; i++) #define FORD(i,b,e) for(int i=b; i>=e; i--) #define SIZE(x) ((int)x.size()) #define pb push_back #define st first #define nd second #define sp ' ' #define ent '\n' const int N=1e5+5; const int SQR=500; const int M=500; int n, m, q, ans, nrg; int t[N], par[N], nr[N], iter[N], grubas[N]; bool mat[M][M]; vi G[N]; int Find(int x){ return x==par[x] ? par[x] : par[x]=Find(par[x]); } void Union(int v, int u){ v=Find(v), u=Find(u); if(v==u) return; ans--; par[v]=u; } void solve(){ int a, b; cin>>n>>m>>q; FOR(i, 1, m){ cin>>a>>b; G[a].pb(b); G[b].pb(a); } FOR(i, 1, n) if(SIZE(G[i])>SQR) grubas[i]=++nrg; FOR(i, 1, n) if(grubas[i]){ for(auto &x: G[i]) if(grubas[x]) mat[grubas[i]][grubas[x]]=1; } vi grubasy; FOR(j, 1, q){ cin>>m; FOR(i, 1, m) cin>>t[i]; FOR(i, 1, m) nr[t[i]]=i; FOR(i, 1, m) iter[t[i]]=j; FOR(i, 1, m) par[i]=i; ans=m; FOR(i, 1, m){ if(grubas[t[i]]) grubasy.pb(i); else for(auto &x: G[t[i]]) if(iter[x]==j) Union(i, nr[x]); } for(auto &x: grubasy){ for(auto &y: grubasy){ if(mat[grubas[t[x]]][grubas[t[y]]]) Union(x, y); } } grubasy.clear(); cout<