#include<bits/stdc++.h>
using namespace std;
#define VI vector<int>
#define PII pair<int, int>
#define VPI vector<PII>
#define mp make_pair
#define eb emplace_back
#define pb push_back
#define st first
#define nd second
#define endl '\n'
#define debug(x) cerr << #x << " " << x << endl;
#define ll long long

//#define int ll

const int N = 1e6 + 7;

int rep[N], ans = 0;
vector<int> G[N], G2[N];
bool vis[N];
int n, m, k;
const int SQRT = 300;

int re(int x) {
	if(rep[x] != x) rep[x] = re(rep[x]);
	return rep[x];
}

void uni(int a, int b) {
	if(vis[a] == false or vis[b] == false) return;
	a = re(a);
	b = re(b);
	//debug(a);
	//debug(b);
	if(a == b) return;
	ans --;
	rep[a] = b;
}

void add(int x) {
	ans ++;
	vis[x] = true;
	if(G[x].size() > SQRT) {
		for(auto y : G2[x]) {
			uni(x, y);
		}
	} else {
		for(auto y : G[x]) {
			uni(x, y);
		}
	}
}
void solve(){
	cin >> n >> m >> k;
	
	for(int i = 1; i <= n; i++) {
		rep[i] = i;
	}
	for(int i = 0; i < m; i++) {
		int a, b;
		cin >> a >> b;
		G[a].push_back(b);
		G[b].push_back(a);
	}
	
	for(int i = 1; i <= n; i++) {
		if(G[i].size() > SQRT) {
			for(auto x : G[i]) {
				if(G[x].size() > SQRT) {
					G2[i].push_back(x);
				}
			}
		}
	}
	
	while(k--) {
		cin >> m;
		vector<pair<int, int> > vek;
		
		for(int i = 0; i < m; i++) {
			int a;
			cin >> a;
			vek.push_back({G[a].size(), a});
		}
		
		sort(vek.begin(), vek.end());
		reverse(vek.begin(), vek.end());
		
		for(auto x : vek) {
			add(x.second);
		}
		
		cout << ans << endl;
		
		for(auto x : vek) {
			rep[x.second] = x.second;
			vis[x.second] = false;
		}
		ans = 0;
	}
}

int32_t main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	int test = 1;
	
	while(test--){
		solve();
	}
	
	return 0;
}


