#include using namespace std; const int N = 1e5 + 7; const int P = 300; int n, m, q; vector G[N]; map , bool> M; int _n; vector ids; bool is[N]; bool vis[N]; vector G2[N]; void build1(){ for(int i = 0; i < _n; ++i) for(int j = i + 1; j < _n; ++j) if(M.count({ids[i], ids[j]})){ G2[ids[i]].push_back(ids[j]); G2[ids[j]].push_back(ids[i]); } } void build2(){ for(int i = 0; i < _n; ++i) for(auto v: G[i]) if(is[v]) G2[ids[i]].push_back(v); } void dfs(int u){ vis[u] = true; for(auto v: G2[u]) if(!vis[v]) dfs(v); } int main(){ scanf("%d %d %d", &n, &m, &q); for(int i = 1; i <= m; ++i){ int u, v; scanf("%d %d", &u, &v); if(u > v) swap(u, v); M[{u, v}] = true; G[u].push_back(v); G[v].push_back(u); } while(q--){ scanf("%d", &_n); ids.resize(_n); for(int i = 0; i < _n; ++i) scanf("%d", &ids[i]); sort(ids.begin(), ids.end()); for(auto v: ids) is[v] = true; if(_n < P) build1(); else build2(); int ans = 0; for(auto v: ids) if(!vis[v]){ dfs(v); ++ans; } printf("%d\n", ans); for(auto v: ids){ G2[v].clear(); is[v] = vis[v] = false; } } return 0; }