#include <bits/stdc++.h> using namespace std; typedef long long int ll; typedef vector<int> vi; typedef pair<int,int> pii; const int N = 100010; class node { public : vi near; vi to; }; vi scca[N]; node a[N]; node b[N]; bool vis[N]={0}; int nn; int scc[N]; int fin[N]; bool df[N]={0}; int tim = 1; vi tmp; void dfs(int j) { df[j]=1; vi v = a[j].near; for(int i=0;i<v.size();i++) { if(!df[v[i]])dfs(v[i]); } fin[tim]=j; tim++; } void dfs1(int j) { df[j]=1; tmp.push_back(j); vi v = a[j].to; for(int i=0;i<v.size();i++) { if(!df[v[i]])dfs1(v[i]); } } void pre(int n) { for(int i=1;i<=n;i++) df[i]=0; tim=1; for(int i=1;i<=n;i++) { if(!df[i])dfs(i); } for(int i=1;i<=n;i++) { df[i]=0; } int cmp = 1; for(int i=n;i>0;i--) { int x = fin[i]; if(df[x])continue; tmp.clear(); dfs1(x); for(int j=0;j<tmp.size();j++) scc[tmp[j]]=cmp; scca[cmp]=tmp; cmp++; } nn=cmp-1; // for(int i=1;i<=nn;i++) // { // tmp = scca[i]; // for(int j=0;j<tmp.size();j++) // cout<<tmp[j]<<" "; // cout<<endl; // } } vector<pii> edges; vi tsort; void dfs2(int j) { df[j]=1; vi v = b[j].near; for(int i=0;i<v.size();i++) { if(!df[v[i]])dfs2(v[i]); } tsort.push_back(j); } void topsort() { for(int i=1;i<=nn;i++) df[i]=0; for(int i=1;i<=nn;i++) { if(!df[i])dfs2(i); } reverse(tsort.begin(), tsort.end()); // for(int i=0;i<tsort.size();i++) // { // cout<<tsort[i]<<" "; // } // cout<<endl; } int lvl[N]; int req[N]={0}; int nxtlvl[N]={0}; bool Check(int j) { if(!req[j])return 1; int jlvl = lvl[j]; if(nxtlvl[jlvl]==0)return 1; int k = nxtlvl[jlvl]; queue<int> q; q.push(j); df[j]=1; while(!q.empty()) { int top = q.front(); q.pop(); vi v = b[top].near; for(int i=0;i<v.size();i++) { if(df[v[i]])continue; if(lvl[v[i]]>k)continue; if(lvl[v[i]]==k)return 1; df[v[i]]=1; q.push(v[i]); } } return 0; } bool check(int n) { for(int i=0;i<nn;i++) lvl[tsort[i]]=i; nxtlvl[nn-1]=0; for(int i=nn-2;i>=0;i--) { if(req[tsort[i+1]])nxtlvl[i]=i+1; else nxtlvl[i]=nxtlvl[i+1]; } for(int i=0;i<=n;i++) df[i]=0; for(int i=0;i<tsort.size();i++) { if(!Check(tsort[i]))return 0; } return 1; } int main() { int test; cin>>test; for(int z=1;z<=test;z++) { int n,m,k; cin>>n>>m>>k; int x; for(int i=1;i<=n;i++) vis[i]=0; for(int i=0;i<=n;i++) { a[i].near.clear(); a[i].to.clear(); b[i].near.clear(); scca[i].clear(); df[i]=0; edges.clear(); req[i]=0; tsort.clear(); nxtlvl[i]=0; tim=1; } for(int i=1;i<=k;i++) { scanf("%d",&x); vis[x]=1; } int y; for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); a[x].near.push_back(y); a[y].to.push_back(x); edges.push_back(pii(x,y)); } pre(n); for(int i=0;i<edges.size();i++) { x = edges[i].first; y = edges[i].second; int xx = scc[x], yy = scc[y]; if(xx!=yy) { b[xx].near.push_back(yy); } } topsort(); for(int i=1;i<=n;i++) { if(vis[i])req[scc[i]]=1; } if(!check(n)) { cout<<-1<<endl; continue; } for(int i=0;i<tsort.size();i++) { if(req[tsort[i]]) { tmp = scca[tsort[i]]; sort(tmp.begin(), tmp.end()); for(int k=0;k<tmp.size();k++) if(vis[tmp[k]])cout<<tmp[k]<<" "; } } cout<<endl; } }