判断集合的点是否覆盖所有边
//
// main.cpp
// PATA1134
//
// Created by Phoenix on 2018/2/26.
// Copyright © 2018年 Phoenix. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn = 10010;
int G[maxn][maxn] = {0};
vector<int> v[maxn];
bool flag[maxn] = {false};
int tag[maxn] = {0};
int main(int argc, const char * argv[]) {
int n, m, k, t;
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; i++) {
int a, b;
scanf("%d %d", &a, &b);
G[a][b] = G[b][a] = i;
v[a].push_back(b);
v[b].push_back(a);
}
scanf("%d", &k);
for(int i = 0; i < k; i++) {
scanf("%d", &t);
int num = 0;
int tag[maxn] = {0};
for(int j = 0; j < t; j++) {
int a;
scanf("%d", &a);
for(int s = 0; s < v[a].size(); s++) {
if(tag[G[a][v[a][s]]] == 0) {
tag[G[a][v[a][s]]] = 1;
num++;
}
}
}
if(num == m) printf("Yes\n");
else printf("No\n");
}
return 0;
}