#include <bits/stdc++.h> using namespace std; #define fru(j,n) for(int j=0; j<(n); ++j) #define tr(it,v) for(auto it=(v).begin(); it!=(v).end(); ++it) #define x first #define y second #define pb push_back #define mp make_pair #define ALL(G) (G).begin(),(G).end() typedef long long ll; typedef double D; typedef pair<int,int> pii; typedef vector<int> vi; const int inft = 1000000009; const int MAXN = 1000006; namespace SCC{ const int MAXN = 1000006; //USTAW, potem init !! int tin[MAXN],ct,n; vi V [MAXN],Q; int scc[MAXN],SCC;//out: 0<=scc[u]<SCC - numer scc w ktorej jest u void przetworz(vi &R){ //zrob cos z ta SCC tr(it,R) scc[*it]=SCC; ++SCC; // printf("w scc o nr %d sa wierzcholki:\n",SCC); // tr(it,R) printf("%d\n",*it); } int dfs(int u){ tin[u]=ct++; Q.pb(u); int m=tin[u]; tr(it,V[u]) if(scc[*it]==-1) { if(tin[*it]!=-1) m=min(m,tin[*it]); else m=min(m,dfs(*it)); } if(m==tin[u]) { vi R; do{ R.pb(Q.back()); Q.pop_back(); }while(R.back()!=u); przetworz(R); } return m; } void init(int _n) //to na poczatku { n=_n; fru(i,n) V[i].clear(); fru(i,n) scc[i]=tin[i]=-1; SCC=0; ct=0; } void krawedz(int a,int b){//0<=a,b<n V[a].push_back(b); } void go(){ fru(i,n) if(tin[i]==-1) dfs(i); } } vector<pii> V[MAXN]; int prio[MAXN]; bool vis[MAXN]; int inorder[MAXN]; int order[MAXN],nr; vector<int> S[MAXN]; int last[MAXN]; void solve() { int n,m,k; scanf("%d%d%d",&n,&m,&k); SCC::init(n); vi K(k); vector<pii> E(m); fru(i,k)scanf("%d",&K[i]); fru(i,k)K[i]--; fru(i,m){ int a,b; scanf("%d%d",&a,&b);a--;b--; SCC::krawedz(a,b); E[i]=pii(a,b); } SCC::go(); //mam scc, tworze graf i min_lex toposort int s=SCC::SCC; fru(i,s)V[i].clear(); fru(i,s)prio[i]=MAXN+i; fru(i,k)prio[SCC::scc[K[i]]]=min(K[i],prio[SCC::scc[K[i]]]); fru(i,m){ int u=SCC::scc[E[i].x],v=SCC::scc[E[i].y]; if(u==v)continue; V[u].push_back(pii(prio[v],v)); } fru(i,s)sort(ALL(V[i])); fru(i,s)V[i].resize(unique(ALL(V[i]))-V[i].begin()); /* puts("SCC"); fru(i,n)printf("%d ",SCC::scc[i]);puts(""); printf("%d\n",s); fru(i,s){tr(it,V[i])printf("%d ",it->y);puts("");} fru(i,s)printf("%d ",prio[i]);puts(""); */ //lex min fru(i,s)vis[i]=0; fru(i,s)tr(it,V[i])inorder[it->y]++; nr=0; fru(i,s)S[i].clear(); fru(i,k)S[SCC::scc[K[i]]].pb(K[i]); fru(i,s)sort(ALL(S[i])); //lex sort fru(i,s)last[i]=0; int curr=0; priority_queue<pii> Q; fru(i,s)if(inorder[i]==0)Q.push(pii(-prio[i],i)); bool ok=true; while(!Q.empty()){ pii u=Q.top();Q.pop(); // printf("a%d, curr %d, last%d\n",u.y,curr,last[u.y]); tr(it,S[u.y])order[nr++]=*it; if(!S[u.y].empty()&& last[u.y]<curr)ok=false; if(!S[u.y].empty())last[u.y]=++curr; tr(it,V[u.y]){ inorder[it->y]--; last[it->y]=max(last[it->y],last[u.y]); // printf("zazn %d %d-> %d",it->y,last[it->y],last[u.y]); if(inorder[it->y]==0)Q.push(pii(-prio[it->y],it->y)); } } if(!ok)printf("-1\n");else //check if ordering is good {fru(i,k)printf("%d ",order[i]+1);puts("");} } int main() { // freopen("input.in", "r", stdin); // freopen("output.out", "w", stdout); int t=1; scanf("%d",&t); fru(i,t) solve(); return 0; }