#include <iostream> #include <algorithm> #include <vector> #include <cstring> #include <cassert> #define MAXN 100010 using namespace std; int n,m,k; int x[MAXN],y[MAXN]; vector<int> e[MAXN]; int id[MAXN],lo[MAXN],curid; bool onstk[MAXN]; vector<int> stk; vector<int> c[MAXN]; vector<int> a; int cid[MAXN]; bool has[MAXN]; vector<int> ee[MAXN]; vector<int> comps; int ord[MAXN]; int dp[MAXN]; void dfs(int u) { stk.push_back(u); id[u] = lo[u] = ++curid; onstk[u] = 1; for (int v : e[u]) { if (!id[v]) { dfs(v); lo[u] = min(lo[u], lo[v]); } else if (onstk[v]) lo[u] = min(lo[u], id[v]); } if (id[u] == lo[u]) { while (1) { int v = stk.back(); cid[v] = u; c[u].push_back(v); if (y[v]) has[u] = 1; stk.pop_back(); onstk[v] = 0; if (v == u) break; } //cerr << u << ": "; for (int v : c[u]) { //cerr << v << ' '; for (int w : e[v]) { if (cid[w] != u) { ee[u].push_back(cid[w]); } } } //cerr << endl; sort(ee[u].begin(),ee[u].end()); ee[u].erase(unique(ee[u].begin(),ee[u].end()),ee[u].end()); comps.push_back(u); if (has[u]) a.push_back(u); } } bool dfs2(int u, int e) { if (u == e) return 1; if (ord[u] > ord[e]) return 0; if (dp[u] != -1) return dp[u]; dp[u] = 0; for (int v : ee[u]) { if (dfs2(v,e)) { dp[u] = 1; return 1; } } return 0; } bool ok() { reverse(comps.begin(),comps.end()); for (int i = 0; i < comps.size(); i++) ord[comps[i]] = i; reverse(a.begin(),a.end()); for (int i = 0; i + 1 < a.size(); i++) { if (!dfs2(a[i],a[i+1])) return 0; } return 1; } void init() { memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); for (int i = 1; i <= n; i++) e[i].clear(); memset(id,0,sizeof(id)); memset(lo,0,sizeof(lo)); curid = 0; stk.clear(); for (int i = 1; i <= n; i++) c[i].clear(); a.clear(); memset(cid,0,sizeof(cid)); memset(has,0,sizeof(has)); for (int i = 1; i <= n; i++) ee[i].clear(); comps.clear(); memset(ord,0,sizeof(ord)); memset(dp,-1,sizeof(dp)); } int main() { ios::sync_with_stdio(0); int T; cin >> T; while (T--) { cin >> n >> m >> k; init(); for (int i = 0; i < k; i++) { cin >> x[i]; y[x[i]] = 1; } for (int i = 0; i < m; i++) { int u,v; cin >> u >> v; e[u].push_back(v); } for (int i = 1; i <= n; i++) { if (!id[i]) dfs(i); } if (!ok()) { cout << -1 << '\n'; } else { for (int i : a) { sort(c[i].begin(),c[i].end()); for (int j : c[i]) { if (y[j]) cout << j << ' '; } } cout << '\n'; } } }