#include using namespace std; using ll = long long; using Vi = vector; using Pii = pair; #define mp make_pair #define pb push_back #define x first #define y second #define rep(i,b,e) for(int i = (b); i < (e); i++) #define each(a, x) for(auto& a : (x)) #define all(x) (x).begin(),(x).end() #define sz(x) int((x).size()) vector dir; vector active; Vi par, ver; int curVer = 1; int find(int v) { if (ver[v] != curVer) { ver[v] = curVer; par[v] = -1; } if (par[v] == -1) { return v; } return par[v] = find(par[v]); } bool join(int u, int v) { u = find(u); v = find(v); if (u != v) { par[u] = v; return 1; } return 0; } void solve() { int n; cin >> n; Vi elems(n); curVer++; each(e, elems) { cin >> e; e--; active[e] = 1; } int ans = n; each(v, elems) { each(e, dir[v]) { if (active[e]) { ans -= join(v, e); } } } each(e, elems) { active[e] = 0; } cout << ans << '\n'; } int main() { cin.sync_with_stdio(0); cin.tie(0); cout << fixed << setprecision(12); int n, m, p; cin >> n >> m >> p; vector G(n); Vi deg(n); rep(i, 0, m) { int a, b; cin >> a >> b; a--; b--; G[a].pb(b); G[b].pb(a); deg[a]++; deg[b]++; } Vi num(n, -1); priority_queue, greater> que; int nextNum = 0; rep(i, 0, n) { que.push({ deg[i], i }); } while (!que.empty()) { int v = que.top().y; que.pop(); if (num[v] != -1) continue; num[v] = ++nextNum; each(e, G[v]) { if (num[e] != -1) continue; deg[e]--; que.push({ deg[e], e }); } } dir.resize(n); rep(i, 0, n) { each(e, G[i]) { if (num[e] > num[i]) { dir[i].pb(e); } } } active.resize(n); par.resize(n); ver.resize(n); while (p--) { solve(); } return 0; }