//做此题的前提是要理解拓扑排序的基本概念
#include<iostream>
#include <cstring>
using namespace std;
int main()
{
int N, M;
cin >> N >> M;
bool prime[N + 10][N + 10];
memset(prime, false, sizeof(prime));//初始化为false
for (int i = 0; i < M; ++i) {//记录边
int v1, v2;
cin >> v1 >> v2;
prime[v1][v2] = true;
}
int K;
cin >> K;
int num = 0;//记录错误个数,其实是用来判断输出格式
for (int i = 0; i < K; ++i) {
bool ver[N + 10][N + 10];
memcpy(ver, prime, sizeof(prime));
bool flag = true;//标记判断结果
for (int j = 0; j < N; ++j) {
int key;
cin >> key;
for (int k = 1; k <= N && flag; ++k) {//如果这个情况是错误,则直接跳过判断
if (ver[k][key]) {
flag = false;
num++;
break;
}
ver[key][k] = false;//如果没错,则把当前结点指向其它结点的边全去掉
}
//如果判断为错误后直接break,则后面的数据没读完,所以这里不能break;
}
if (!flag) {
if (num == 1)//第一个错误不用输出空格
cout << i;
else
cout << " " << i;
}
}
return 0;
}