#include <iostream> #include <fstream> #include <cstdio> #include <math.h> #include <vector> #include <string.h> #include <algorithm> #include <climits> #include <stack> #include <queue> #include <set> #include <map> #define MAX(a,b) a>b?a:b #define MIN(a,b) a>b?b:a #define FOR(i,n) for(i=0;i<n;i++) #define FOR_X(i,x,n) for(i=x;i<n;i++) #define BACK(i,n) for(i=n;i>=0;i--) #define BACK_X(i,n,x) for(i=n;i>=x;i--) #define fill(a,v) memset(a,v,sizeof(a)) #define gcd(a,b) __gcd(a,b) #define lcm(a,b) a*b/gcd(a,b) #define pb push_back #define pp pair<int,int> typedef long long int lld; using namespace std; const int N=100005; vector<int> graph[N],trans[N],newgraph[N],nodes[N]; int ele[N],vis[N],indeg[N],hasval[N],lvl[N]; stack<int> st; map<pp,int> m1; queue<int> q1,q2; void refresh(){ fill(ele,0); fill(indeg,0); fill(hasval,0); fill(lvl,0); while(!st.empty()) st.pop(); m1.clear(); while(!q1.empty()) q1.pop(); while(!q2.empty()) q2.pop(); int i; FOR(i,N) { graph[i].clear(); trans[i].clear(); newgraph[i].clear(); nodes[i].clear(); } } void dfs(int x){ vis[x]=1; int i,size=graph[x].size(); FOR(i,size){ if( vis[ graph[x][i] ]== 0 ){ dfs( graph[x][i] ); } } st.push(x); } void dfs2(int x,int comp){ vis[x]=comp; // cout<<x<<" : "<<comp<<endl; nodes[comp].pb(x); if(ele[x]) { hasval[comp]=1; } int i,size=trans[x].size(); FOR(i,size){ if( vis[ trans[x][i] ]==0 ){ dfs2(trans[x][i],comp); } } } int main() { //ios_base::sync_with_stdio(0); //dont use with EOF int t,n,m,k,i; cin>>t; while(t--){ refresh(); cin>>n>>m>>k; FOR(i,k){ int tmp; cin>>tmp; tmp--; ele[tmp]=1; } FOR(i,m){ int u,v; cin>>u>>v; u--; v--; graph[u].pb(v); trans[v].pb(u); } fill(vis,0); FOR(i,n){ if(vis[i]==0){ dfs(i); } } fill(vis,0); int comp=0; while( !st.empty() ){ int tmp= st.top(); st.pop(); // cout<<"stack: "<<tmp<<endl; if( vis[tmp]==0){ comp++; dfs2(tmp,comp); } } // cout<<"done SCC\n"; // FOR(i,n)cout<<i<<" : "<<vis[i]<<endl; for(i=0;i<n;i++) { int si=graph[i].size(); for(int j=0;j<si;j++) { int v=graph[i][j]; if(vis[i]!=vis[v]) { if(m1[pp(vis[i],vis[v])]==0) { newgraph[vis[i]].pb(vis[v]); m1[pp(vis[i],vis[v])]=1; indeg[vis[v]]++; } } } } int var=0,flag=0; for(i=1;i<comp;i++) { if(indeg[i]==0) { //q.push(i); if(hasval[i]){ var++; q2.push(i); } else { q1.push(i); } } } vector<int> ans; while(!q1.empty() || !q2.empty()) { if(var>1) { flag=1; break; } if(!q1.empty()) { int u=q1.front(); q1.pop(); int si=newgraph[u].size(); for(int j=0;j<si;j++) { int v=newgraph[u][j]; indeg[v]--; if(indeg[v]==0) { if(hasval[v]) { var++; q2.push(v); } else { q1.push(v); } } } } else { int u=q2.front(); q2.pop(); ans.push_back(u); var--; int si=newgraph[u].size(); for(int j=0;j<si;j++) { int v=newgraph[u][j]; indeg[v]--; if(indeg[v]==0) { if(hasval[v]) { var++; q2.push(v); } else { q1.push(v); } } } } } // cout<<"done cal\n"; if(flag) { printf("-1\n"); continue; } int si=ans.size(); for(i=0;i<si;i++) { int u=ans[i]; int si2=nodes[u].size(); sort(nodes[u].begin(),nodes[u].end()); for(int j=0;j<si2;j++) { if(ele[nodes[u][j]]) printf("%d ",nodes[u][j]+1); } } printf("\n"); } return 0; }