#include <bits/stdc++.h> using namespace std; const int maxn= 100010 ; vector<int> scc[maxn] ; vector<int> order ; bool vis[maxn] ; bool is[maxn]; int indeg[maxn]; int dp[maxn]; set<int> good_scc[maxn],G[maxn]; vector<int> rg[maxn],g[maxn]; int rm[maxn],lo[maxn],comp[maxn]; void dfs1(int node){ vis[node] = true ; for(int i = 0 ; i < g[node].size() ; ++i){ if(!vis[g[node][i]]){ dfs1(g[node][i]) ; } } order.push_back(node) ; } void dfs2(int node, int id){ vis[node] = false; scc[id].push_back(node) ; if(is[node]){ good_scc[id].insert(node) ; } for(int i = 0 ; i < rg[node].size() ; ++i){ if(vis[rg[node][i]]){ dfs2(rg[node][i],id) ; } } } priority_queue<int> pq; int main(){ // freopen("input.txt","r",stdin) ; ios_base::sync_with_stdio(0) ; cin.tie(0) ; int tc; cin >> tc; while(tc--){ int n ,m,k; cin >> n >> m >> k ; for(int i = 0 ; i < k ; ++i){ int x ; cin>>x; is[x]= true ; } for(int i = 0 ; i < m ; ++i){ int u , v; cin >> u >> v; g[u].push_back(v) ; rg[v].push_back(u) ; } for(int i = 1; i <= n ;++i){ if(!vis[i]){ dfs1(i) ; } } int id = 0 ; for(int i = (int)order.size() - 1; i >= 0 ; --i){ if(vis[order[i]]){ dfs2(order[i],++id); } } // for(int i = 1; i <= id ; ++i){ // cout << "number " << i << "\n" ; // for(int j = 0 ; j < scc[i].size() ; ++j){ // cout << scc[i][j] << " " ; // } // cout << "\n" ; //} for(int i = 1; i <= id ; ++i){ //lo[i]= *min_element(scc[i].begin() , scc[i].end()) ; int val ; if(good_scc[i].size() == 0){ val = *min_element(scc[i].begin() , scc[i].end()) ; } else val = *min_element(good_scc[i].begin() , good_scc[i].end()) ; rm[val] = i ; for(int j = 0 ; j < scc[i].size() ; ++j){ lo[scc[i][j]] = val ; } comp[val] = true ; } for(int i = 1; i<= n; ++i){ for(int j = 0 ;j < g[i].size() ; ++j){ if(lo[i] !=lo[g[i][j]] && G[lo[i]].find(lo[g[i][j]]) == G[lo[i]].end()){ //cout << lo[i] << " " << lo[g[i][j]] << "\n" ; G[lo[i]].insert(lo[g[i][j]]) ; ++indeg[lo[g[i][j]]]; } } } for(int i = 1 ; i <= n ;++i){ if((comp[i]) and (indeg[i] == 0)){ pq.push(i) ; } } order.clear() ; while(!pq.empty()){ int cur = pq.top() ; pq.pop() ; // cout<<cur<<endl; assert(indeg[cur] == 0); order.push_back(cur) ; for(set<int>::iterator itr = G[cur].begin() ; itr != G[cur].end() ; ++itr){ // cout << cur << " " << *itr << "\n" ; indeg[*itr]--; // cout << indeg[*itr] << "\n" ; assert(comp[*itr]); assert(indeg[*itr] >=0); if(indeg[*itr] == 0){ pq.push(*itr) ; } } } for(int i = 1 ; i <= n ;++i){ if(comp[i]) { assert(indeg[i]==0) ; } } for(int j = (int)order.size() - 1; j >= 0 ; --j){ int u = order[j] ; int z = u ; u = rm[u] ; dp[z] = good_scc[u].size(); for(set<int>::iterator itr = G[z].begin() ; itr != G[z].end() ; ++itr){ dp[z] = max(dp[z] , (int)good_scc[u].size() + dp[*itr] ); } } for(int i = 0 ; i < order.size() ; ++i){ int u = order[i] ; u = rm[u]; if(good_scc[u].size() > 0){ int z = order[i] ; if(dp[z] != k){ cout << -1 ; goto done; } break; } } for(int i = 0 ; i < order.size() ; ++i){ int u = order[i] ; u = rm[u] ; for(set<int>::iterator itr = good_scc[u].begin() ; itr != good_scc[u].end() ; ++itr){ cout << (*itr) << " " ; } } done: ; // vector<int> scc[maxn] ; // vector<int> order ; // bool vis[maxn] ; // bool is[maxn]; // int indeg[maxn]; // int dp[maxn]; // set<int> good_scc[maxn],G[maxn]; // vector<int> rg[maxn],g[maxn]; // int rm[maxn],lo[maxn],comp[maxn]; order.clear() ; for(int i = 1; i <= n; ++i){ vis[i] = false ; g[i].clear() ; rg[i].clear() ; G[i].clear() ; good_scc[i].clear() ; is[i] = false ; scc[i].clear(); comp[i]=false; } cout << "\n" ; } return 0 ; }