const int MAXN=1e5+5;
set<int>g[MAXN];
struct Edge{
int u,v;
}edge[MAXN];
int p[MAXN],b[MAXN];
bool vis[MAXN];
int Find(int x){return x==p[x]?x:p[x]=Find(p[x]);}
void Merge(int x,int y){
int xx=Find(x),yy=Find(y);
if(xx!=yy)
p[xx]=yy;
}
int main()
{
int n=read_int(),m=read_int(),q=read_int(),limt=sqrt(m+10);
_for(i,0,m){
edge[i].u=read_int(),edge[i].v=read_int();
g[edge[i].u].insert(edge[i].v);
g[edge[i].v].insert(edge[i].u);
}
while(q--){
int sz=read_int(),ans=0;
_for(i,0,sz){
b[i]=read_int();
vis[b[i]]=true;
p[b[i]]=b[i];
}
if(sz<limt){
_for(i,0,sz)
_for(j,i,sz){
if(g[b[i]].count(b[j]))
Merge(b[i],b[j]);
}
}
else{
_for(i,0,m){
if(vis[edge[i].u]&&vis[edge[i].v])
Merge(edge[i].u,edge[i].v);
}
}
_for(i,0,sz){
ans+=(Find(b[i])==b[i]);
vis[b[i]]=false;
}
enter(ans);
}
return 0;
}