#include <algorithm>
#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int N = 233233;
const int Log = 20;
int n;
int m;
vector<int> graph[N];
vector<int> another[N];
vector<int> tree[N];
int pre[Log][N];
int in[N];
int dep[N];
vector<int> topos;
int que;
int lca (int u, int v) {
if (dep[u] < dep[v]) {
swap (u, v);
}
for (int i = Log - 1; i >= 0; i--) {
if (dep[pre[i][u]] >= dep[v]) {
u = pre[i][u];
}
}
if (u == v) {
return u;
}
for (int i = Log - 1; i >= 0; i--) {
if (pre[i][u] != pre[i][v]) {
u = pre[i][u];
v = pre[i][v];
}
}
return pre[0][u];
}
int main () {
freopen ("carrot.in", "r", stdin);
freopen ("carrot.out", "w", stdout);
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
graph[u].push_back(v);
another[v].push_back(u);
in[v]++;
}
queue<int> q;
q.push(1);
while (!q.empty()) {
int u = q.front();
q.pop();
topos.push_back(u);
for (auto v : graph[u]) {
in[v]--;
if (!in[v]) {
q.push(v);
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j < Log; j++) {
pre[j][i] = 1;
}
}
for (auto u : topos) {
if (another[u].size()) {
int v = another[u][0];
for (int i = 1; i < another[u].size(); i++) {
v = lca (v, another[u][i]);
}
tree[v].push_back(u);
dep[u] = dep[v] + 1;
pre[0][u] = v;
for (int i = 1; i < Log; i++) {
pre[i][u] = pre[i - 1][pre[i - 1][u]];
}
}
}
cin >> que;
for (int i = 1; i <= que; i++) {
int k;
vector<int> nums;
cin >> k;
for (int j = 1; j <= k; j++) {
int u;
cin >> u;
nums.push_back(u);
}
int now = nums[0];
for (int j = 1; j < nums.size(); j++) {
now = lca (now, nums[j]);
}
int maxn = now;
while (true) {
now = pre[0][now];
maxn = max (maxn, now);
if (now == 1) {
break;
}
}
cout << maxn << endl;
}
return 0;
}