#include using namespace std; typedef long long ll; #define rep(i, n) for (int i = 0; i < (n); i++) int main(void){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); 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() < 100000) 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); unordered_set hrany; for (int i = 0; i < N; i++) for (int j : graf[i]) hrany.insert((ll)i*N + j); for (int p : male_indexy) for (int i = 0; i < ps[p].size(); i++) for (int j = 0; j < i; j++) if (hrany.find((ll)ps[p][i]*N + ps[p][j]) != hrany.end()) hnap[p].emplace_back(ps[p][i], ps[p][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]) if (j 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 << '\n'; } }