#include <bits/stdc++.h> using namespace std; bool toVis[100010]; int scc[100010]; bool vis[100010]; void dfs1(int curr,vector< vector<int> >& adjList, stack<int>& s){ vis[curr] = true; for(int i=0;i<adjList[curr].size();i++){ int nxt = adjList[curr][i]; if(vis[nxt]) continue; dfs1(nxt,adjList,s); } s.push(curr); } void dfs2(int curr,vector< vector<int> >& adjList,int currScc){ vis[curr] = true; scc[curr] = currScc; for(int i=0;i<adjList[curr].size();i++){ int nxt = adjList[curr][i]; if(vis[nxt]) continue; dfs2(nxt,adjList,currScc); } } int build(int N, vector< vector<int> >& adjList, vector< vector<int> >& revG){ for(int i=0;i<N;i++) vis[i] = false; stack<int> s; for(int i=0;i<N;i++){ if(vis[i] == false){ dfs1(i,adjList,s); } } for(int i=0;i<N;i++) vis[i] = false; int currScc = 0; while(!s.empty()){ if(!vis[s.top()]){ dfs2(s.top(),revG,currScc); currScc += 1; } s.pop(); } return currScc; } void buildSCCG(int curr, vector< vector<int> >& adjList, vector< set<int> >& sccG){ int cs = scc[curr]; vis[curr] = true; for(int i=0;i<adjList[curr].size();i++){ int here = adjList[curr][i]; if(cs != scc[here])sccG[cs].insert(scc[here]); if(vis[here]) continue; buildSCCG(here,adjList,sccG); } } bool visScc[100010]; int mxSc[100010]; int dfsFin(int curr, vector< set<int> > & adjList){ vis[curr] = true; int maxSc = 0; for(set<int>::iterator it = adjList[curr].begin();it!=adjList[curr].end();it++){ int here = (*it); if(vis[here]){ //cout<<curr+1<<" "<<maxSc<<" "<<here+1<<" "<<mxSc[here]<<endl; maxSc = max(maxSc,mxSc[here]); continue; } maxSc = max(maxSc,dfsFin(here,adjList)); } return mxSc[curr] = maxSc+(visScc[curr]?1:0); } int ans[100010]; void getAns(int curr, vector< set<int> >& adjList, vector< vector<int> >& parts,int idx,int rem){ if(visScc[curr] == true){ for(int i=0;i<parts[curr].size();i++){ if(toVis[parts[curr][i]]){ // cout<<idx<<" "<<parts[curr][i]+1<<endl; ans[idx++] = parts[curr][i]; } } rem -= 1; } for(set<int>::iterator it = adjList[curr].begin();it!=adjList[curr].end();it++){ int here = (*it); if(mxSc[here] == rem){ getAns(here,adjList,parts,idx,rem); break; } } } int main(){ int cases;cin>>cases; for(int n=0;n<cases;n++){ int N,M,K;cin>>N>>M>>K; vector<int> touch(K); for(int i=0;i<N;i++){ visScc[i] = false; toVis[i] = false; mxSc[i] = 0; //maxScVis[i] = 0; } for(int i=0;i<K;i++){ int x;cin>>x;x--; toVis[x] = true; touch[i] = x; } vector< vector<int> > adjList(N); vector< vector<int> > revG(N); for(int i=0;i<M;i++){ int x,y;cin>>x>>y;x--;y--; adjList[x].push_back(y); revG[y].push_back(x); } int totalSc = build(N,adjList,revG); //for(int i=0;i<N;i++) cout<<scc[i]<<" "; //cout<<endl; int scCnt =0 ; for(int i=0;i<touch.size();i++){ if(visScc[scc[touch[i]]] == false){ scCnt += 1; visScc[scc[touch[i]]] = true; } } vector< set<int> > sccG(totalSc); vector< vector<int> > parts(totalSc); for(int i=0;i<N;i++) parts[scc[i]].push_back(i); for(int i=0;i<parts.size();i++) sort(parts[i].begin(),parts[i].end()); for(int i=0;i<N;i++) vis[i] = false; for(int i=0;i<N;i++){ if(!vis[i]){ buildSCCG(i,adjList,sccG); } } // Number of scc's that we need to visit //cout<<scCnt<<endl; for(int i=0;i<N;i++) vis[i] = false; for(int i=0;i<totalSc;i++){ if(!vis[i])dfsFin(i,sccG); } //for(int i=0;i<totalSc;i++) cout<<mxSc[i]<<" "; //cout<<endl; bool p = false; for(int i=0;i<totalSc;i++){ if(mxSc[i] == scCnt){ p = true; getAns(i,sccG,parts,0,scCnt); break; } } if(!p) cout<<-1<<endl; else{ for(int i=0;i<K;i++) cout<<ans[i]+1<<" "; cout<<endl; } } return 0; }