#include using namespace std; typedef long long ll; typedef long double ld; #define rep(i, a, n) for (int i = (a); i < (n); i++) #define per(i, a, n) for (int i = (n) - 1; i >= (a); i--) #define FOR(i, n) rep(i, a, (n)) struct UF { vector e; UF(int n) : e(n, -1) {} bool same_set(int a, int b) { return find(a) == find(b); } int find(int x) { return e[x] < 0 ? x : e[x] = find(e[x]); } void join(int a, int b) { a = find(a), b = find(b); if (a == b) return; if (e[a] > e[b]) swap(a, b); e[a] += e[b]; e[b] = a; } }; ll hash_edge(int a, int b) { return (((ll)min(a,b)) << (20)) | (ll)max(a,b); } int main(void) { ios_base::sync_with_stdio(false); int n, m, q; cin >> n >> m >> q; unordered_set edges; vector> g(n); rep(i,0,m) { int x, y; cin >> x >> y; x--; y--; if (x > y) { swap(x,y); } edges.insert(hash_edge(x,y)); g[x].push_back(y); g[y].push_back(x); } int MAGIC = sqrt(n); UF dfu(n); rep(qi,0,q) { vector qv; unordered_set qs; int qn; cin >> qn; rep(i,0,qn) { int x; cin >> x; x--; qv.push_back(x); qs.insert(x); dfu.e[x] = -1; } if (qn < MAGIC) { rep(i,0,qn) rep(j,i+1,qn) { if (edges.count(hash_edge(qv[i], qv[j]))) { dfu.join(qv[i], qv[j]); } } } else { rep(i,0,qn) { for(int j : g[qv[i]]) { if (qs.count(j)) { dfu.join(qv[i], j); } } } } int res = 0; rep(i,0,qn) { if (dfu.e[qv[i]] < 0) { res++; } } cout << res << endl; } return 0; }