#include #define FOR(i,s,e) for(int i=(s); i<=(e); i++) #define FORD(i,s,e) for(int i=(s); i>=(e); i--) #define ALL(k) (k).begin(),(k).end() #define e1 first #define e2 second #define pb push_back using namespace std; using LL = long long; const int MAXN = 100111; const int DIF = 333; vector specials; vector edges[MAXN]; vector loc_edges[MAXN]; int special[MAXN]; int in[MAXN]; int fu[MAXN]; int find(int a){ if(fu[a] < 0) return a; fu[a] = find(fu[a]); return fu[a]; } int unie(int a, int b){ int aa = find(a), bb = find(b); //printf("Doing union between %d %d: %d\n", a, b, (aa==bb)?1:0); if(aa == bb )return 0; if(fu[aa] > fu[bb]) swap(aa,bb); fu[aa] += fu[bb]; fu[bb] = aa; return 1; } main(){ int n, e, p; scanf("%d%d%d", &n,&e,&p); FOR(i,1,n) fu[i] = -1; FOR(i,1,e){ int a,b; scanf("%d%d",&a,&b); edges[a].pb(b); edges[b].pb(a); } FOR(i,1,n){ if((int)edges[i].size() > DIF){ special[i] = 1; for(auto b:edges[i]){ if((int)edges[b].size() > DIF){ loc_edges[i].pb(b); } } } } FOR(prop, 1, p){ int m; scanf("%d",&m); vector vs; FOR(i,1,m){ int a; scanf("%d",&a); vs.pb(a); in[a] = 1; fu[a] = -1; } int ans = m; for(auto &v: vs){ if(special[v]){ for(auto &b: loc_edges[v]){ if(in[b]){ ans -= unie(v,b); } } } else{ for(auto &b: edges[v]){ if(in[b]){ ans -= unie(v,b); } } } } printf("%d\n", ans); for(auto &v:vs){ in[v] = 0; fu[v] = -1; } } }