#include using namespace std; using ll=long long; using ld=double; #define FOR(i,a,b) for(ll i=a;i<(ll)b;++i) #define F(n) FOR(i,0,n) #define FF(n) FOR(j,0,n) #define aa first #define bb second #define PB push_back #define EQ(a,b) (fabs(a-b)<=(fabs(a+b)*EPS)) #define MOD ((ll)(1e9+7)) #define INF (1ll << 40) struct UnionFind { vector parent; vector depth; UnionFind(int n): parent(vector(n)), depth(vector(n,0)) { for(int i = 0; i < n; ++i) parent[i] = i; } int find(int v){ return (v== parent[v]) ? v : parent[v] = find(parent[v]); } bool check(int a, int b){ return find(a) == find(b); } void do_union(int a, int b){ if(a==b) return; int ar = find(a), br = find(b); if(depth[ar] < depth[br]) { parent[ar] = br; }else if(depth[ar] > depth[br]) { parent[br] = ar; } else { parent[br] = ar; depth[ar] ++; } } }; int main() { ios::sync_with_stdio(0);cin.tie(0); ll n; cin >> n; UnionFind uf(n); ll e; cin >> e; ll p; cin >> p; map mp; vector> g(n); F(e) { ll a, b; cin >> a >> b; a --; b --; g[a].insert(b); g[b].insert(a); /*if (mp.find(a) == mp.end()) mp[a] = mp.size(); if (mp.find(b) == mp.end()) mp[b] = mp.size(); uf.do_union(mp[a], mp[b]);*/ } F(p) { ll m; cin >> m; map mm; set cur; F(m) { ll t; cin >> t; t --; mm[t] = mm.size(); //cout << t << endl; cur.insert(t); } UnionFind uf(mm.size()); set big; set notBig; for (ll i: cur) { //cout << i << endl; if (g[i].size() <= 500) { for (ll j: g[i]) { if (cur.count(j)) uf.do_union(mm[i], mm[j]); } notBig.insert(i); } else { /*for (ll j: cur) { if (g[i].count(j)) uf.do_union(mm[i], mm[j]); }*/ big.insert(i); } } for (ll i: notBig) { for (ll j: g[i]) if (big.count(j)) uf.do_union(mm[i], mm[j]); } set comps; F(mm.size()) { comps.insert(uf.find(i)); } cout << comps.size() << endl; } return 0; }