//Mobius_Treap #include<bits/stdc++.h> using namespace std; typedef pair<int,int> II; typedef vector< II > VII; typedef vector<int> VI; typedef vector< VI > VVI; typedef long long int LL; #define PB push_back #define MP make_pair #define F first #define S second #define SZ(a) (int)(a.size()) #define ALL(a) a.begin(),a.end() #define SET(a,b) memset(a,b,sizeof(a)) #define si(n) scanf("%d",&n) #define dout(n) printf("%d\n",n) #define sll(n) scanf("%lld",&n) #define lldout(n) printf("%lld\n",n) #define fast_io ios_base::sync_with_stdio(false);cin.tie(NULL) //#define TRACE #ifdef TRACE #define trace(...) __f(#__VA_ARGS__, __VA_ARGS__) template <typename Arg1> void __f(const char* name, Arg1&& arg1){ cerr << name << " : " << arg1 << std::endl; } template <typename Arg1, typename... Args> void __f(const char* names, Arg1&& arg1, Args&&... args){ const char* comma = strchr(names + 1, ',');cerr.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...); } #else #define trace(...) #endif //FILE *fin = freopen("in","r",stdin); //FILE *fout = freopen("out","w",stdout); const int N = int(2e5)+10; VI g[N]; VI rg[N],order,togo[N]; VI dag[N]; int indeg[N]; int nn,comp[N]; bool go[N]; int vis[N]; void reset(int n,int m) { for(int i=0;i<N;i++) { g[i].clear(),rg[i].clear(),togo[i].clear(),dag[i].clear(); comp[i]=0; vis[i]=0; go[i]=false; indeg[i]=0; } nn=0; order.clear(); } void dfs1(int u) { vis[u]=1; for(int i=0;i<SZ(g[u]);i++) if(!vis[g[u][i]]) dfs1(g[u][i]); order.PB(u); } void dfs2(int u) { vis[u]=1; comp[u]=nn; if(go[u])togo[nn].PB(u); for(int i=0;i<SZ(rg[u]);i++) if(!vis[rg[u][i]]) dfs2(rg[u][i]); } void dfs(int u) { vis[u]=1; for(int i=0;i<SZ(dag[u]);i++) if(!vis[dag[u][i]]) dfs(dag[u][i]); } int main() { int t;si(t); while(t--) { int n,m,k; si(n);si(m);si(k); for(int i=0;i<k;i++) { int x;si(x); go[x]=true; } for(int i=0;i<m;i++) { int u,v; si(u);si(v); g[u].PB(v); rg[v].PB(u); } //build dag for(int i=1;i<=n;i++) if(!vis[i]) dfs1(i); SET(vis,0); nn=0; for(int i=1;i<=n;i++) { int v = order[n-i]; if(!vis[v]) { dfs2(v); nn++; } } for(int i=1;i<=n;i++) for(int j=0;j<SZ(g[i]);j++) if(comp[i]!=comp[g[i][j]]) { dag[comp[i]].PB(comp[g[i][j]]); indeg[comp[g[i][j]]]++; } //dag done :) queue<int> Q[2]; int curr=0,nxt=1; for(int i=0;i<nn;i++) if(indeg[i]==0) Q[curr].push(i); int s = -1; int cnt=0; VI ans; ans.clear(); while(!Q[curr].empty()) { int u = Q[curr].front(); Q[curr].pop(); if(SZ(togo[u])>0) { s = u; sort(ALL(togo[u])); ans.insert(ans.end(),ALL(togo[u])); cnt++; } for(int i=0;i<SZ(dag[u]);i++) { indeg[dag[u][i]]--; if(!indeg[dag[u][i]]) Q[nxt].push(dag[u][i]); } if(SZ(Q[curr])==0) { swap(curr,nxt); if(cnt>0) break; } } if(cnt>1) { dout(-1); reset(n,m); while(!Q[1].empty())Q[1].pop(); while(!Q[0].empty())Q[0].pop(); continue; } //ok SET(vis,0); dfs(s); bool ok=true; cnt=0; while(!Q[curr].empty()) { int u = Q[curr].front(); Q[curr].pop(); trace(u,vis[u],SZ(togo[u])); if(!vis[u] && SZ(togo[u])>0) { ok = false; break; } if(vis[u] && SZ(togo[u])>0) { cnt++; if(cnt>1) { ok = false; break; } else { sort(ALL(togo[u])); ans.insert(ans.end(),ALL(togo[u])); } } for(int i=0;i<SZ(dag[u]);i++) { indeg[dag[u][i]]--; if(!indeg[dag[u][i]]) Q[nxt].push(dag[u][i]); } if(SZ(Q[curr])==0) { swap(curr,nxt); cnt=0; } } if(!ok)dout(-1); else for(int i=0;i<SZ(ans);i++)printf("%d%s",ans[i],i==SZ(ans)-1?"\n":" "); reset(n,m); while(!Q[1].empty())Q[1].pop(); while(!Q[0].empty())Q[0].pop(); } return 0; }