#include<bits/stdc++.h>
using namespace std;

vector<vector<int> > h;

unordered_set<long long> edg;

int comp(){
	int ans = 0;
	int n = h.size();
	int vis[n];
	fill(vis, vis + n, 0);
	
	vector<int> dfs;
	
	for(int i = 0; i<n; i++){
		if(vis[i] == 0){
			dfs.push_back(i);
			vis[i] = 1;
			ans++;
			while(!dfs.empty()){
				int x = dfs.back();
				dfs.pop_back();
				for(auto y: h[x]){
					if(vis[y] == 0){
						vis[y] = 1;
						dfs.push_back(y);
					}
				}
			}
		}
	}
	
	return ans;
}


int main(){
	int n, m, p;
	cin >> n >> m >> p;
	pair<int, int> last[n];
	fill(last, last + n, make_pair(-1, -1));
	
	vector<int> g[n];
	for(int i = 0; i<m; i++){
		int x, y;
		cin >> x >> y;
		g[x - 1].push_back(y - 1);
		g[y - 1].push_back(x - 1);
		edg.insert(min(x - 1, y - 1) * (long long)1e6 + max(x - 1, y - 1));
	}
	
	for(int i = 0; i<p; i++){
		int x;
		cin >> x;
		
		vector<int> vert;
		for(int j = 0; j<x; j++){
			int y;
			cin >> y;
			vert.push_back(y - 1);
			last[y - 1] = {i, j};
		}
			
		h.clear();
		h.resize(x);
				
		if(x < 300){
			for(int j = 0; j<x; j++){
				for(int k = j + 1; k<x; k++){
					if(edg.count((long long)1e6 * min(vert[j], vert[k]) + max(vert[j], vert[k]))){
						h[j].push_back(k);
						h[k].push_back(j);
					}
				}
			}
		}
		
		else{
			for(int j = 0; j<n; j++){
				for(auto x: g[j]){
					if(last[j].first == i && last[x].first == i){
						h[last[j].second].push_back(last[x].second);
						h[last[x].second].push_back(last[j].second);
					}
				}
			}
		}
		
		cout << comp() << endl;
	}
	
	
	
}

