#include<bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define ft first #define sd second #define mem(a,v) memset(a,v,sizeof(a)) typedef long long int ll; typedef pair<int, int> PII; vector<vector<int> > adj(100100), cmpt(100100), scc(100100); bool visited[100100]; int toVisit[100100]; int node[100100]; stack<int> S; void dfs(int u) { visited[u] = true; for(int i=0; i<adj[u].size(); i++){ if(!visited[adj[u][i]]){ dfs(adj[u][i]); } } S.push(u); } void SCC(int u, int cnt) { visited[u] = true; scc[cnt].pb(u); node[u] = cnt; for(int i=0; i<cmpt[u].size(); i++){ if(!visited[cmpt[u][i]]){ SCC(cmpt[u][i], cnt); } } } int visCount; void check(int u) { visited[u] = true; if(toVisit[u] == 2) visCount++; for(int i=0; i<adj[u].size(); i++){ if(!visited[adj[u][i]]) check(adj[u][i]); } } bool go(int u, int v) { if(u == v){ // cout<<"here\n"; return true; } visited[u] = true; bool ret = false; for(int i=0; i<adj[u].size(); i++){ if(!visited[adj[u][i]]) ret |= go(adj[u][i], v); } //visited[u] = false; return ret; } int main() { int t; cin>>t; while(t--){ int n, m, k; cin>>n>>m>>k; mem(toVisit, 0); for(int i=1; i<=k; i++){ int x; scanf("%d", &x); toVisit[x] = 1; } for(int i=1; i<=n; i++){ adj[i].clear(); cmpt[i].clear(); scc[i].clear(); } for(int i=1; i<=m; i++){ int x, y; scanf("%d %d", &x, &y); if(x == y) continue; adj[x].pb(y); cmpt[y].pb(x); } mem(visited, false); for(int i=1; i<=n; i++){ if(!visited[i]) dfs(i); } mem(visited, false); int cnt = 1; vector<int> topo; while(!S.empty()){ int nxt = S.top(); S.pop(); topo.pb(nxt); if(!visited[nxt]){ SCC(nxt, cnt); cnt++; } } for(int i=1; i<cnt; i++){ sort(scc[i].begin(), scc[i].end()); } vector<int> res; for(int i=0; i<topo.size(); i++){ int nd = topo[i]; if(toVisit[nd] == 1){ int Node = node[nd]; for(int j=0; j<scc[Node].size(); j++){ int nd1 = scc[Node][j]; if(toVisit[nd1] == 1){ res.pb(nd1); toVisit[nd1] = 2; } } } } assert(res.size() == k); mem(visited, false); visCount = 0; check(res[0]); if(visCount != k){ cout<<"-1\n"; } else{ if(k <= 10000){ mem(visited, false); bool flag = true; for(int i=0; i<res.size()-1; i++){ /*if(start[res[i]] < start[res[i+1]] && finish[res[i]] > finish[res[i+1]]) ; else{ flag = true; }*/ mem(visited, false); flag &= go(res[i], res[i+1]); //cout<<flag<<"\n"; } if(!flag){ cout<<"-1\n"; } else{ for(int i=0; i<res.size(); i++){ cout<<res[i]<<" "; } cout<<"\n"; } } else{ for(int i=0; i<res.size(); i++){ cout<<res[i]<<" "; } cout<<"\n"; } } } return 0; }