#include <bits/stdc++.h> using namespace std; const int N = 3e5 + 5; int n, m, k; int low[N], num[N]; int sccID[N]; int sccCount; int mustVisitCount[N]; int memo[N]; bool active[N]; bool mustVisit[N]; bool visit[N]; vector<int> adj[N]; vector<int> adjc[N]; vector<int> st; vector<vector<int>> sccs; int timer; void dfs(int u, int par) { num[u] = low[u] = ++timer; st.push_back(u); active[u] = true; for (int v : adj[u]) { if (num[v] == -1) { dfs(v, u); low[u] = min(low[u], low[v]); } else if (active[v]) { low[u] = min(low[u], num[v]); } } if (num[u] == low[u]) { sccs.push_back(vector<int>()); for (;;) { int v = st.back(); st.pop_back(); active[v] = false; sccID[v] = sccCount; if (mustVisit[v]) { mustVisitCount[sccCount]++; sccs.back().push_back(v); } if (v == u) break; } sccCount++; } } int countVisit(int u) { if (memo[u] != -1) { return memo[u]; } int ret = 0; for (int v : adjc[u]) { ret = max(ret, countVisit(v)); } ret += mustVisitCount[u]; return memo[u] = ret; } vector<int> getOrder(int start) { vector<int> ret; int need = k; int cur = start; while (need > 0) { sort(begin(sccs[cur]), end(sccs[cur])); for (int i : sccs[cur]) { ret.push_back(i); } need -= mustVisitCount[cur]; int nxt = -1; for (int v : adjc[cur]) { if (countVisit(v) == need) { nxt = v; break; } } if (need == 0) break; cur = nxt; if (cur == -1) for (;;); } return ret; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { cin >> n >> m >> k; for (int i = 0; i < n; i++) { adj[i].clear(); adjc[i].clear(); mustVisit[i] = false; } for (int i = 0; i < k; i++) { int x; cin >> x; x--; mustVisit[x] = true; } for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; u--; v--; adj[u].push_back(v); } fill(num, num + n, -1); fill(mustVisitCount, mustVisitCount + n, 0); timer = -1; sccCount = 0; sccs.clear(); for (int i = 0; i < n; i++) { if (num[i] == -1) { dfs(i, -1); } } for (int i = 0; i < sccCount; i++) { adjc[i].clear(); } for (int u = 0; u < n; u++) { for (int v : adj[u]) { if (sccID[u] != sccID[v]) { adjc[sccID[u]].push_back(sccID[v]); } } } fill(memo, memo + n, -1); int start = -1; for (int i = 0; i < sccCount; i++) { int cur = countVisit(i); if (cur == k) { start = i; } } if (start != -1) { auto res = getOrder(start); if ((int)res.size() != k) for (;;); for (int i = 0; i < k; i++) { cout << res[i] + 1 << (i == k - 1 ? '\n' : ' '); } } else { cout << -1 << '\n'; } } return 0; }