/* SHUBHAM RAI-IIIT Hyderabad */ #include<bits/stdc++.h> using namespace std; #define FOR(i,a,b) for(i=a;i<b;i++) #define REP(i,a) for(i=0;i<a;i++) #define LLD long long int #define MOD 1000000007 #define si(n) scanf("%d",&n); #define si2(n,m) scanf("%d%d",&n,&m); #define sl(n) scanf("%lld",&n); #define TR(container,it) for(typeof(container.begin()) it=container.begin();it!=container.end();it++) #define F first #define S second #define pb push_back #define mp make_pair typedef pair<int,int> PII; #define TRACE #ifdef TRACE #define trace1(x) cerr << #x << ": " << x << endl; #define trace2(x, y) cerr << #x << ": " << x << " | " << #y << ": " << y << endl; #define trace3(x, y, z) cerr << #x << ": " << x << " | " << #y << ": " << y << " | " << #z << ": " << z << endl; #define trace4(a, b, c, d) cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " << #d << ": " << d << endl; #define trace5(a, b, c, d, e) cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " << #d << ": " << d << " | " << #e << ": " << e << endl; #define trace6(a, b, c, d, e, f) cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " << #d << ": " << d << " | " << #e << ": " << e << " | " << #f << ": " << f << endl; #else #define trace1(x) #define trace2(x, y) #define trace3(x, y, z) #define trace4(a, b, c, d) #define trace5(a, b, c, d, e) #define trace6(a, b, c, d, e, f) #endif vector<int> G[100010],RG[100010],NG[100010],same[100010],order; int v[100010],ans[100010],id,tovisit[100010],tovisit1[100010],cnt[100010],c1,path[100010]; stack<int> topo; void init() { int i; REP(i,100002) { same[i].clear(); G[i].clear();RG[i].clear();NG[i].clear(); ans[i]=0; v[i]=0; tovisit[i]=0; tovisit1[i]=0; cnt[i]=path[i]=0; } c1=0; id=1; order.clear(); } void dfs1(int x) { if(v[x]) return; v[x]=1; int i; REP(i,G[x].size()) dfs1(G[x][i]); order.pb(x); } void dfs2(int x) { if(v[x]==2) return; v[x]=2; int i; REP(i,RG[x].size()) dfs2(RG[x][i]); same[id].pb(x); ans[x]=id; } void scc(int n) { int i,j; FOR(i,1,n+1) dfs1(i); for(i=n-1;i>-1;i--) { if(v[order[i]]!=2) { dfs2(order[i]); id++; } } // FOR(i,1,n+1) // printf("%d %d\n",i,ans[i]); return; } void dfs3(int n) { if(v[n]) return; v[n]=1; int i,l=NG[n].size(); for(i=0;i<l;i++) { int x=NG[n][i]; dfs3(x); path[n]=max(path[n],path[x]); } if(tovisit1[n]) path[n]++; c1=max(path[n],c1); topo.push(n); } int main() { int t; si(t); while(t--) { int n,m,k,i,j; cin>>n>>m>>k; init(); REP(i,k) { int x; si(x); tovisit[x]=1; } REP(i,m) { int x,y; si2(x,y); G[x].pb(y); RG[y].pb(x); } scc(n); FOR(i,1,n+1) if(tovisit[i]) tovisit1[ans[i]]=1; FOR(i,1,n+1) { int l=G[i].size(); REP(j,l) { int x=G[i][j]; if(ans[i]==ans[x]) continue; else { NG[ans[i]].pb(ans[x]); cnt[ans[x]]++; //in degree in new graph } } } int c=0; FOR(i,1,id) { sort(same[i].begin(),same[i].end()); if(tovisit1[i]) c++; //number of components which contain atleast 1 node to be visited v[i]=0; } FOR(i,1,id) //checking if answer exists and toposort if(!v[i]) dfs3(i); if(c1<c) { printf("-1\n"); continue; } while(!topo.empty()) { int x=topo.top(); // trace1(x); topo.pop(); if(tovisit1[x]) { tovisit1[x]=0; int l=same[x].size(); REP(i,l) { int u=same[x][i]; if(tovisit[u]) printf("%d ",u); } } } printf("\n"); } return 0; }