#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;  
//如果当前的结点入度≠0则不是拓扑序列,如果为0则将它能到达的结点的入度-1
//一定要注意多个for循环的循环变量i不能写混乱,可以为i、ii、iii
   
int main(){   
    int n,m;//点数n  边数m
    vector<int> v[1010];
    scanf("%d %d",&n,&m);
    int in[1000+1]={0};
    int a,b;
    //用邻接表保存这个图
    for(int i=0;i<m;i++){
        scanf("%d %d",&a,&b);
        v[a].push_back(b);//a指向b结点
        in[b]++;//b结点的入度+1
    }
    int k;
    scanf("%d",&k);//k次查询
    bool space=false;//是否输出空格
    for(int i=0;i<k;i++){
        int A[1010];
        for(int ii=0;ii<n;ii++)
            scanf("%d",&A[ii]);//读入一次查询的拓扑序列
        vector<int>temp(in,in+n+1);
        for(int iii=0;iii<n;iii++)
            if(temp[A[iii]]!=0){//当前入度不为0,则非拓扑序列
                printf("%s%d",space?" ":"",i);
                space=true;
                break;
            }else{//入度为0
                for(int j:v[A[iii]])//遍历能到达的结点并将入度-1
                    --temp[j];
            }
    }
    system("pause");
    return 0;   
}