#include "bits/stdc++.h" using namespace std; const int MAXN = 100005; int T; int n, m, k; vector<int> g[MAXN]; int cnt; vector<int> comp[MAXN]; vector<int> g2[MAXN], g1[MAXN]; int nm[MAXN]; char need[MAXN]; char was[MAXN]; int mark[MAXN]; vector<int> order; int in[MAXN]; int nxt[MAXN]; int R[MAXN]; bool error; void dfs1 (int v) { was[v] = 1; for (int i = 0 ;i < (int) g[v].size (); i++) { if (!was[g[v][i]]) { dfs1 (g[v][i]); } } order.push_back (v); } void dfs2 (int v) { nm[v] = cnt; comp[cnt].push_back (v); was[v] = 1; for (int i = 0; i < (int) g1[v].size (); i++) { if (!was[g1[v][i]]) dfs2 (g1[v][i]); } } void build () { for (int i = 1; i <= cnt; i++) { sort (comp[i].begin (), comp[i].end ()); int N = 0; for (int j = 0; j < (int) comp[i].size (); j++) { N += (need[comp[i][j]]); for (int k = 0; k < (int) g[comp[i][j]].size (); k++) { if (nm[g[comp[i][j]][k]] != i) { g2[i].push_back (nm[g[comp[i][j]][k]]); in[nm[g[comp[i][j]][k]]]++; } } } mark[i] = N; } } void read () { scanf ("%d %d %d", &n, &m, &k); for (int i = 0, a; i < k; i++) { scanf ("%d", &a); need[a] = 1; } for (int i = 0, a, b; i < m; i++) { scanf ("%d %d", &a, &b); g[a].push_back (b); g1[b].push_back (a); } } int get_path (int v) { if (was[v]) return R[v]; was[v] = 1; R[v] = 0; for (int i = 0; i < (int) g2[v].size (); i++) { int t = get_path (g2[v][i]); if (t > R[v]) { R[v] = t; nxt[v] = g2[v][i]; } } return R[v] += mark[v]; } void solve () { memset (was, 0, sizeof (was) ); order.clear (); for (int i = 1; i <= n; i++) { if (was[i] == 0) { dfs1 (i); } } reverse (order.begin (), order.end ()); memset (was, 0, sizeof (was) ); for (int i = 0; i < (int) order.size (); i++) { if (was[order[i]]) continue; cnt++; dfs2 (order[i]); } build (); for (int i = 1; i <= cnt; i++) { if (!in[i]) g2[0].push_back (i); } memset (nxt, 0xff, sizeof (nxt)); memset (was, 0, sizeof (was)); int ln = get_path (0); if (ln != k) { printf ("-1\n"); return; } int cur = 0; while (cur != -1) { for (int i = 0; i < (int) comp[cur].size (); i++) { if (need[comp[cur][i]]) printf ("%d ", comp[cur][i]); } cur = nxt[cur]; } puts (""); } void clear () { for (int i = 1; i <= n; i++) { g[i].clear (); g1[i].clear (); } for (int i = 0; i <= cnt; i++) { g2[i].clear (); } for (int i = 1; i <= n; i++) { need[i] = 0; } for (int i = 1; i <= cnt; i++) { comp[i].clear (); } for (int i = 1; i <= cnt; i++) { in[i] = 0; } cnt = 0; error = false; } int main () { scanf ("%d", &T); while (T --> 0) { read (); solve (); clear (); } return 0; }