#include using namespace std; typedef long long ll; #define rep(i, n) for (int i = 0; i < (n); i++) int main(void){ int N, E, P; cin >> N >> E >> P; vector> graf(N); for (int i = 0; i < E; i++) { int a, b; cin >> a >> b; a--; b--; graf[a].push_back(b); graf[b].push_back(a); } vector> ps(P); vector> pnav(N); for (int i = 0; i < P; i++) { int M; cin >> M; for (int j = 0; j < M; j++) { int x; cin >> x; x--; ps[i].push_back(x); //pnav[x].push_back(i); } } vector male_indexy, velke_indexy; for (int i = 0; i < P; i++) { if (ps[i].size() * ps[i].size() < N) male_indexy.push_back(i); else velke_indexy.push_back(i); } for (int i : male_indexy) for (int j : ps[i]) pnav[j].push_back(i); vector>> hnap(P); for (int i = 0; i < N; i++) { unordered_map> pnav2; for (int j : pnav[i]) for (int k : ps[j]) { pnav2[k].push_back(j); } for (int j : graf[i]) for (int p : pnav2[j]) hnap[p].push_back({i, j}); } vector> ps2(P); for (int p : velke_indexy) for (int i : ps[p]) ps2[p].insert(i); for (int i = 0; i < N; i++) for (int j : graf[i]) for (int p : velke_indexy) if (ps2[p].find(i) != ps2[p].end() && ps2[p].find(j) != ps2[p].end()) hnap[p].push_back({i, j}); for (int p = 0; p < P; p++) { sort(ps[p].begin(), ps[p].end()); unordered_map mapa; for (int i = 0; i < ps[p].size(); i++) mapa[ps[p][i]] = i; int n = ps[p].size(); vector> graf(n); for (pair h : hnap[p]) { int a = mapa[h.first], b = mapa[h.second]; graf[a].push_back(b); graf[b].push_back(a); } vector visited(n); int ans = 0; for (int i = 0; i < n; i++) if (!visited[i]) { ans++; stack s; s.push(i); while (!s.empty()) { int x = s.top(); s.pop(); if (visited[x]) continue; visited[x] = true; for (int j : graf[x]) s.push(j); } } cout << ans << endl; } }