#include using namespace std; #define FOR(a, b, c) for(int a = (b); a < (c); a++) #define SZ(a) (int)((a).size()) #define SIZE(a) (int)((a).size()) #define ALL(a) (a).begin(), (a).end() using ll = long long; #define LL long long #define PB push_back const int N = 1e5 + 7; vector graf[N], grafG[N]; bitset act, vis, duzy; int gr[N], roz[N]; int Find(int x) { return (gr[x] == x ? x : gr[x] = Find(gr[x])); } bool Union(int a, int b) { a = Find(a), b = Find(b); if(a == b) return false; if(roz[a] < roz[b]) swap(a, b); roz[a] += roz[b]; gr[b] = a; return true; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m, p; cin >> n >> m >> p; while(m--) { int a, b; cin >> a >> b; a--, b--; graf[a].PB(b); graf[b].PB(a); } FOR(i, 0, n) { if(SZ(graf[i]) > 300) { duzy[i] = true; } } FOR(i, 0, n) if(duzy[i]) { for(auto& v : graf[i]) { if(duzy[v]) { grafG[i].PB(v); } } } while(p--) { int k; cin >> k; vector x(k); for(auto& i : x) { cin >> i; i--; gr[i] = i; roz[i] = 1; act[i] = true; } int res = k; for(auto& i : x) { if(not duzy[i]) { for(auto& v : graf[i]) { if(act[v]) { res -= Union(i, v); } } } else { for(auto& v : grafG[i]) { if(act[v]) { res -= Union(i, v); } } } } for(auto& i : x) { act[i] = 0; } cout << res << "\n"; } }