#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
using namespace std;
/*hash思想:a(num)到i点组成的t号边=v[num][t],即v[num][t]号边
注意t号边指该点的第几条边,v[num][t]号边为总边号,遍历时以他为下标的hash数组元素赋1*/
//法2:用set,s.insert(v[num][t]),打印时就判断s.size()为m则YES

int main(){
int n,m,k,nv,a,b,num;
scanf("%d%d",&n,&m);//n点m边
//vector<int> v[n]; //我的vs在n飙红。。
vector<vector<int>> v(n);
for(int i=0;i<m;i++){
scanf("%d%d",&a,&b);
v[a].push_back(i);
v[b].push_back(i);
}
scanf("%d",&k);//k次查询
for(int i=0;i<k;i++){
scanf("%d",&nv);//点集合的点数
int flag=0;
vector<int> hash(m,0);
for(int j=0;j<nv;j++){
scanf("%d",&num);//点集合的点编号
for(int t=0;t<v[num].size();t++)
//遍历num点的所有边
hash[ v[num][t] ]=1;
//v[num][t]为num点所在的t号边的编号
//法2:s.insert(v[num][t])下面判断打印的if:s.size()==m则YES
}
for(int j=0;j<m;j++){
if(hash[j]==0){
printf("No\n");
flag=1;
break;
}
}
if(flag==0) printf("Yes\n");//flag细节
}
system("pause");
return 0;
}