#include <iostream> #include <vector> #include <algorithm> #include <cmath> #include <queue> #include <set> #include <cstdio> #include <cstdlib> #include <stack> #include <cstring> #include <iomanip> #include <cctype> #include <map> #include <cassert> using namespace std; vector<vector<int> > G,Gr; const int N = 100005; int visited[N]; vector<int> order; void dfs1(int u) { for(int i = 0;i < Gr[u].size();i++) { int v = Gr[u][i]; if(!visited[v]) { visited[v] = 1; dfs1(v); } } order.push_back(u); } int cur; int p[N]; void dfs2(int u) { for(int i = 0;i < G[u].size();i++) { int v = G[u][i]; if(!visited[v]) { p[v] = cur; visited[v] = 1; dfs2(v); } } } int mark[N]; vector<vector<int> > sccSorted; vector<set<int> > Graph; int val[N]; #define indeg first.first #define value first.second #define vertex second int getInt() { int n = 0; char c = getchar_unlocked(); while(!isdigit(c)) c = getchar_unlocked(); while(isdigit(c)) { n = (n<<3) + (n<<1) + c - '0'; c = getchar_unlocked(); } return n; } int dp[N]; void solve() { int n,m,k; cin>>n>>m>>k; G.clear(); Gr.clear(); G.resize(n + 1); Gr.resize(n + 1); for(int i = 1;i <= n;i++) mark[i] = 0; for(int i = 0;i < k;i++) { int t = getInt(); mark[t] = 1; } for(int i = 0;i < m;i++) { int x = getInt(),y = getInt(); G[x].push_back(y); Gr[y].push_back(x); } for(int i = 1;i <= n;i++) visited[i] = 0; order.clear(); for(int i = 1;i <= n;i++) { if(!visited[i]){ visited[i] = 1; dfs1(i); } } for(int i = 1;i <= n;i++) visited[i] = 0; reverse(order.begin(),order.end()); cur = 0; for(int i = 0;i < n;i++) { if(!visited[order[i]]) { p[order[i]] = cur; visited[order[i]] = 1; dfs2(order[i]); cur++; } } sccSorted.clear(); sccSorted.resize(cur); for(int i = 1;i <= n;i++) { if(mark[i]) { sccSorted[p[i]].push_back(i); } } for(int i = 0;i < cur;i++) { sort(sccSorted[i].begin(),sccSorted[i].end()); if(sccSorted[i].size() > 0) val[i] = sccSorted[i][0]; else val[i] = 0; } Graph.clear(); Graph.resize(cur); for(int i = 1;i <= n;i++) { for(int j = 0;j < G[i].size();j++) { if(p[i] != p[G[i][j]]) { Graph[p[i]].insert(p[G[i][j]]); } } } vector<int> indegree(cur,0); for(int i = 0;i < cur;i++) { for(set<int>::iterator it = Graph[i].begin();it != Graph[i].end();it++) { indegree[*it]++; } } priority_queue<pair<pair<int,int>,int>,vector< pair<pair<int,int>,int> >, greater< pair<pair<int,int>,int> > > q; for(int i = 0;i < cur;i++) { if(indegree[i] == 0) q.push(make_pair(make_pair(indegree[i],val[i]),i)); } vector<int> finalOrder; while(!q.empty()) { pair<pair<int,int>,int> c = q.top(); q.pop(); if(c.indeg == indegree[c.vertex] && indegree[c.vertex] == 0) { finalOrder.push_back(c.vertex); for(set<int>::iterator it = Graph[c.vertex].begin();it != Graph[c.vertex].end();it++) { int v = *it; indegree[v]--; q.push( make_pair( make_pair(indegree[v],val[v]) , v) ); } } } vector<int> ans; for(int i = 0;i < cur;i++) { for(int j = 0;j < sccSorted[finalOrder[i]].size();j++) { ans.push_back(sccSorted[finalOrder[i]][j]); } } for(int i = 0;i < cur;i++) dp[i] = -1; vector<int> theOrder; for(int i = 0;i < cur;i++) { int u = finalOrder[i]; for(set<int>::iterator it = Graph[u].begin();it != Graph[u].end();it++) { int v = *it; if(sccSorted[u].size() > 0) dp[v] = u; else dp[v] = dp[u]; } if(sccSorted[u].size() > 0) { theOrder.push_back(u); } } for(int i = 1;i < theOrder.size();i++) { if(dp[theOrder[i]] != theOrder[i - 1]) { cout<<-1<<endl; return; } } for(int i = 1;i <= n;i++) visited[i] = 0; visited[ans[0]] = 1; dfs2(ans[0]); for(int i = 1;i <= n;i++) { if(mark[i]) { if(!visited[i]) { cout<<-1<<endl; return; } } } for(int i = 0;i < k;i++) { printf("%d ",ans[i]); } cout<<endl; } int main() { int t; cin>>t; while(t--) { solve(); } }