#ifndef LOCAL #pragma GCC optimize("O3") #endif #include using namespace std; #define sim template muu & operator<<( #define ris return *this #define R22(r) sim> typename enable_if<1 r sizeof(dud(0)),muu&>::type operator<<(c g) { sim> struct rge {c b, e;}; sim> rge range(c i, c j) {return rge{i, j};} sim> auto dud(c*r)->decltype(cerr << *r); sim> char dud(...); struct muu { #ifdef LOCAL stringstream a; ~muu() {cerr << a.str() << endl;} R22(<) a << boolalpha << g; ris;} R22(==) ris << range(begin(g), end(g));} sim mor rge u) { a << "["; for (c i = u.b; i != u.e; ++i) *this << ", " + 2 * (i == u.b) << *i; ris << "]"; } sim, class b mor pair r){ris << "(" << r.first << ", " << r.second << ")";} #else sim mor const c&){ris;} #endif }; #define debug muu() << __FUNCTION__ << "#" << __LINE__ << ": " #define imie(r...) "[" #r ": " << (r) << "] " #define range(a, b) "[[" #a ", " #b "): " << range(a, b) << "] " #define arr(a, i) "[" #a imie(i) ": " << a[i] << "] " using ll = long long; using ld = long double; using pii = pair ; int N, E, P; const int maxn = 2e5; unordered_set Edges[maxn]; vector Eds; int p[maxn]; int Find(int x) { if(p[x] == x) return x; else return p[x] = Find(p[x]); } void Union(int a, int b) { p[Find(a)] = Find(b); } void init() { for(int i = 0; i < N; ++i) p[i] = i; } bool jest[maxn]; void solve_male(vector V) { for(int v : V) jest[v] = true; int sz = V.size(); for(int i = 0; i < sz; ++i) for(int j = i + 1; j < sz; ++j) if(Edges[V[i]].count(V[j]) > 0) Union(V[i], V[j]); int res = 0; for(int v : V) if(p[v] == v && jest[v]) ++res; printf("%d\n", res); for(int v : V) jest[v] = false; for(int v : V) p[v] = v; } void solve_duze(vector V) { for(int v : V) jest[v] = true; for(auto ed : Eds) if(jest[ed.first] && jest[ed.second]) Union(ed.first, ed.second); int res = 0; for(int v : V) if(p[v] == v && jest[v]) ++res; printf("%d\n", res); for(int v : V) jest[v] = false; for(int v : V) p[v] = v; } int main() { scanf("%d%d%d", &N, &E, &P); init(); for(int i = 0; i < E; ++i) { int a, b; scanf("%d%d", &a, &b); --a; --b; Edges[a].insert(b); Edges[b].insert(a); Eds.push_back({a,b}); } for(int q = 0; q < P; ++q) { int ile; scanf("%d", &ile); vector V; for(int i = 0; i < ile; ++i) { int x; scanf("%d", &x); --x; V.push_back(x); } if(ile < 100) solve_male(V); else solve_duze(V); } }