#include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algorithm> #include <set> #include <queue> using namespace std; typedef long long LL; typedef pair <int, int> PII; const int MAXN = 1e6 + 7, Mo = 1e9 + 7; class Gabow{ public: static const int SIZE = 200005; int cnt,idx[SIZE]; int gao(int n, const vector<int> e[]){ Pc=Qc=-1; for(int i=cnt=0;i<n;i++) idx[i]=tag[i]=-1; for(int i=use=0;i<n;i++) if(tag[i]<0) dfs(i,e); return cnt; } private: int tag[SIZE],P[SIZE],Q[SIZE],use,Pc,Qc; void dfs(int x, const vector<int> e[]){ tag[P[++Pc]=Q[++Qc]=x]=use++; for(size_t i=0;i<e[x].size();i++){ int y=e[x][i]; if(~idx[y]) continue; if(~tag[y]) while(tag[y]<tag[Q[Qc]]) Qc--; else dfs(y,e); } if(Q[Qc]==x) Qc--; else return; do idx[P[Pc]]=cnt; while(P[Pc--]!=x); cnt++; } }; struct Node{ vector <int> v; int id; Node(vector<int> a, int b): v(a), id(b) {} bool operator < (const Node &a) const{ // notice! /*int n = min(v.size(), a.v.size()); for (int i=0; i<n; i++){ if (v[i] > a.v[i]) return true; if (v[i] < a.v[i]) return false; } return true;*/ return v > a.v; } }; int N, M, K; int tar[MAXN]; vector <int> E[MAXN]; void init(){ scanf("%d%d%d", &N, &M, &K); for (int i=0; i<N; i++){ tar[i] = 0; E[i].clear(); } for (int i=0; i<K; i++){ int x; scanf("%d", &x); x--; tar[x] = 1; } for (int i=0; i<M; i++){ int x, y; scanf("%d%d", &x, &y); x--; y--; E[x].push_back(y); } } vector <int> edge[MAXN], mem[MAXN]; set <int> nxt[MAXN]; int deg[MAXN] = {}; // input degree Gabow G; void work(){ int cnt = G.gao(N, E); for (int i=0; i<cnt; i++){ edge[i].clear(); mem[i].clear(); nxt[i].clear(); deg[i] = 0; } for (int i=0; i<N; i++){ int u = G.idx[i]; if (tar[i]) mem[u].push_back(i); for (auto &x : E[i]){ int v = G.idx[x]; if (u == v) continue; if (nxt[u].count(v) == 0){ nxt[u].insert(v); edge[u].push_back(v); deg[v]++; } } } int sum = 0; priority_queue <Node> Q; for (int i=0; i<cnt; i++) if (deg[i] == 0){ Q.push(Node(mem[i], i)); if (mem[i].size() > 0) sum++; } bool noans = sum > 1; vector <int> ans; while (!Q.empty()){ if (Q.top().v.size() > 0) sum--; for (auto &x : Q.top().v) ans.push_back(x); int now = Q.top().id; Q.pop(); for (auto &x : edge[now]){ deg[x]--; if (deg[x] == 0){ Q.push(Node(mem[x], x)); if (mem[x].size() > 0) sum++; } } if (sum > 1) noans = true; } if (noans || ans.size() != K){ puts("-1"); return; } for (int i=0; i<ans.size(); i++){ printf("%d%c", ans[i]+1, (i+1<ans.size())?' ':'\n'); } } int main(){ int t; scanf("%d", &t); while (t--){ init(); work(); } return 0; }