#include #include #include #include static int dsu_root(std::vector& roots, int x) { if (roots[x] == x) return x; roots[x] = dsu_root(roots, roots[x]); return roots[x]; } int main() { int n = 0, e = 0, p = 0; std::cin >> n >> e >> p; std::vector> nodes; std::set> edges; std::vector roots; nodes.resize(n+1); roots.resize(n+1); while ((e--) > 0) { int a = 0, b = 0; std::cin >> a >> b; nodes[a].push_back(b); nodes[b].push_back(a); edges.insert(std::make_pair(a,b)); edges.insert(std::make_pair(b,a)); } while ((p--) > 0) { int m = 0, r = 0; std::cin >> m; if (m < 50) { std::vector nodei; nodei.resize(m); while ((m--) > 0) { int a = 0; std::cin >> a; nodei[m] = a; roots[a] = a; } for (size_t i = 0; i < nodei.size(); i++) { int ni = nodei[i]; for (size_t j = 0; j < i; j++) { int nj = nodei[j]; if (edges.count(std::make_pair(ni,nj))) { int p = dsu_root(roots, ni); int q = dsu_root(roots, nj); if (p < q) roots[q] = p; else if (p > q) roots[p] = q; } } } for (size_t i = 0; i < nodei.size(); i++) { int ni = nodei[i]; if (roots[ni] == ni) r++; } } else { std::vector nodei; nodei.resize(n+1); while ((m--) > 0) { int a = 0; std::cin >> a; nodei[a] = true; roots[a] = a; } for (std::pair edge : edges) { if (nodei[edge.first] && nodei[edge.second]) { int p = dsu_root(roots, edge.first); int q = dsu_root(roots, edge.second); if (p < q) roots[q] = p; else if (p > q) roots[p] = q; } } for (size_t i = 0; i < nodei.size(); i++) { if (nodei[i] && roots[i] == (int)i) r++; } } std::cout << r << std::endl; } return 0; }