#include #include using namespace std; const int MAXN = 1<<17; const int SQRT = 3<<7; vector edges[MAXN]; vector hedges[MAXN]; bool heavy[MAXN]; int cookie[MAXN]; int dad[MAXN]; int arr[MAXN]; int sol; int find(int i) { return dad[dad[i]] == dad[i] ? dad[i] : (dad[i] = find(dad[i])); } void merge(int i, int j) { i = find(i); j = find(j); if (i == j) return; if (rand() & 1) swap(i, j); dad[i] = j; --sol; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, e, p; cin>>n>>e>>p; for (int i = 0; i < e; ++i) { int a, b; cin>>a>>b; --a, --b; edges[a].push_back(b); edges[b].push_back(a); } for (int i = 0; i < n; ++i) if (edges[i].size() > SQRT) { heavy[i] = true; for (int j: edges[i]) if (heavy[j]) { hedges[i].push_back(j); hedges[j].push_back(i); } } while (p--) { int m; cin>>m; for (int i = 0; i < n; ++i) { dad[i] = i; } sol = m; for (int i = 0; i < m; ++i) { cin>>arr[i]; --arr[i]; cookie[arr[i]] = p + 1; } for (int i = 0; i < m; ++i) { int x = arr[i]; const vector& es = (heavy[x] ? hedges[x] : edges[x]); for (int j: es) if (cookie[j] == p + 1) { //cout<