#include <bits/stdc++.h> using namespace std; const int N = 200010; int n, m, isDeliveryZone[N], k, inDeg[N], topOrder[N], marks[N], seen[N]; vector<int> G[N], g[N]; vector<int> deliveryZones, topVec; vector<int> ans[N]; struct edge{int e, nxt;}; int V, E; edge e[N], er[N]; int sp[N], spr[N]; int group_cnt, group_num[N]; bool v[N]; int stk[N]; void fill_forward(int x) { int i; v[x]=true; for(i=sp[x];i;i=e[i].nxt) if(!v[e[i].e]) fill_forward(e[i].e); stk[++stk[0]]=x; } void fill_backward(int x) { int i; v[x]=false; group_num[x]=group_cnt; for(i=spr[x];i;i=er[i].nxt) if(v[er[i].e]) fill_backward(er[i].e); } void add_edge(int v1, int v2) //add edge v1->v2 { e [++E].e=v2; e [E].nxt=sp [v1]; sp [v1]=E; er[ E].e=v1; er[E].nxt=spr[v2]; spr[v2]=E; } void SCC() { int i; stk[0]=0; memset(v, false, sizeof(v)); for(i=1;i<=V;i++) if(!v[i]) fill_forward(i); group_cnt=0; for(i=stk[0];i>=1;i--) if(v[stk[i]]){group_cnt++; fill_backward(stk[i]);} } void pain() { // ios_base::sync_with_stdio(false); // cin.tie(NULL); memset(isDeliveryZone, 0, sizeof isDeliveryZone); memset(inDeg, 0, sizeof inDeg); memset(topOrder, 0, sizeof topOrder); memset(marks, 0, sizeof marks); memset(sp, 0, sizeof sp); memset(spr, 0, sizeof spr); memset(v, 0, sizeof v); memset(stk, 0, sizeof stk); memset(group_num, 0, sizeof group_num); deliveryZones.clear(); topVec.clear(); for(int i=0; i<N; i++) { g[i].clear(); G[i].clear(); ans[i].clear(); } //cin >> n >> m >> k; //scanf("%d", &n); //cin >> m >> k; scanf("%d%d%d", &n, &m, &k); V = n; E = 0; for(int i=0; i<k; i++) { int x; //cin >> x; scanf("%d", &x); deliveryZones.push_back(x); isDeliveryZone[x] = 1; } for(int i=0; i<m; i++) { int u, v; //cin >> u >> v; scanf("%d%d", &u, &v); G[u].push_back(v); add_edge(u, v); } SCC(); for(int i=1; i<=n; i++) { for(int j: G[i]) { if(group_num[i] != group_num[j]) { g[group_num[i]].push_back(group_num[j]); } } } for(int i=1; i<=n; i++) { g[i].resize(unique(g[i].begin(), g[i].end()) - g[i].begin()); } for(int i=1; i<=group_cnt; i++) { for(int j: g[i]) { inDeg[j]++; } } queue<int> q; for(int i=1; i<=group_cnt; i++) { if(inDeg[i] == 0) { q.push(i); } } memset(seen, 0, sizeof seen); int ctrr = 0; while(not q.empty()) { ctrr++; if(ctrr > 3 * N) break; int now = q.front(); q.pop(); topVec.push_back(now); topOrder[now] = topVec.size(); for(int next: g[now]) { inDeg[next]--; if(inDeg[next] == 0) { if(not seen[next]) { q.push(next); } } } } set<int> keyGroups; for(int i=1; i<=n; i++) { if(isDeliveryZone[i]) { keyGroups.insert(group_num[i]); } } vector<pair<int, int> > groupOrder; for(int el: keyGroups) { groupOrder.push_back({topOrder[el], el}); } sort(groupOrder.begin(), groupOrder.end()); bool reachable = true; int toVisit = groupOrder.size(), visited = 1; q.push(groupOrder[0].second); memset(seen, 0, sizeof seen); ctrr = 0; while(not q.empty()) { ctrr++; if(ctrr > 3 * N) break; int now = q.front(); q.pop(); if(groupOrder[visited].second == now) { visited++; } if(visited == toVisit) { break; } int l = groupOrder[visited - 1].first, r = groupOrder[visited].first; for(int next: g[now]) { if(not seen[next]) { if(topOrder[next] > l and topOrder[next] <= r) { q.push(next); } } } } if(visited != toVisit) { printf("-1\n"); return; } for(int i=1; i<=n; i++) { if(isDeliveryZone[i]) { ans[group_num[i]].push_back(i); } } for(int i=1; i<=n; i++) { sort(ans[i].begin(), ans[i].end()); } for(auto el: groupOrder) { for(int x: ans[el.second]) { //cout << x << " "; printf("%d ", x); } } //cout << "\n"; printf("\n"); } int main() { //ios_base::sync_with_stdio(false); //cin.tie(NULL); int tt; cin >> tt; while(tt--) pain(); }