//Done by: gohan95 #include <bits/stdc++.h> #define MAX 10000005 #define INF 1000000007 #define INFLL 1000000000000000007LL #define MOD 1000000007 #define PI 3.14159265359 #define pii pair <int, int> #define pb push_back #define mp make_pair #define fi first #define se second #define set0(a) memset(a, 0, sizeof(a)) #define setdp(a) memset(a, -1, sizeof(a)) #define gc getchar #define pc putchar using namespace std; int idx, n, m, K, P; stack <int> st; int has[200005], vis[200005], child[200005], coun[200005], ans[200005]; vector <pii> edges; struct srt { int id; int ll; int on; } node[200005]; vector <int> adj[200005], out[200005], vv[200005]; void scn(int yy) { //cout << yy << endl; node[yy].id = idx; node[yy].ll = idx; int yu = P; idx++; P++; st.push(yy); node[yy].on = 1; int i, t1; for (i = 0; i < adj[yy].size(); i++) { t1 = adj[yy][i]; if (node[t1].id == -1) { scn(t1); node[yy].ll = min(node[yy].ll, node[t1].ll); } else if (node[t1].on) { node[yy].ll = min(node[yy].ll, node[t1].id); } } if (node[yy].ll == node[yy].id) { t1 = 0; while (st.top() != yy) { node[st.top()].on = 0; node[st.top()].ll = yu; if (has[st.top()]) { t1++; out[node[yy].ll].pb(st.top()); } st.pop(); } if (has[yy]) { t1++; out[node[yy].ll].pb(yy); } ans[node[yy].ll] = t1; node[yy].ll = yu; node[yy].on = 0; st.pop(); } } void tarjan() { idx = 0; P = 0; while (!st.empty()) st.pop(); int i; for (i = 1; i <= n; i++) { if (node[i].id == -1) scn(i); } } int dfs(int yy) { vis[yy] = 1; int i, t1, t2 = 0, t3, pos = -1; for (i = 0; i < vv[yy].size(); i++) { t1 = vv[yy][i]; if (!vis[t1]) { coun[t1] = dfs(t1); } t3 = coun[t1]; if (t3 > t2) { t2 = t3; pos = t1; } } t2 += ans[yy]; child[yy] = pos; return t2; } void fnc(int yy) { int i; for (i = 0; i < out[yy].size(); i++) cout << out[yy][i] << " "; if (child[yy] != -1) fnc(child[yy]); } void mems() { int i; set0(has); set0(vis); set0(ans); for (i = 0; i < 100005; i++) { adj[i].clear(); vv[i].clear(); out[i].clear(); node[i].id = -1; node[i].ll = 0; node[i].on = 0; } edges.clear(); } int main() { int t; cin >> t; while (t--) { mems(); int i, j, u, v; cin >> n >> m >> K; for (i = 1; i <= K; i++) { scanf("%d", &u); has[u] = 1; } for (i = 1; i <= m; i++) { scanf("%d%d", &u, &v); node[i].id = -1; adj[u].pb(v); edges.pb(mp(u, v)); } tarjan(); /*for (i = 1; i <= n; i++) cout << node[i].ll << " "; cout << endl;*/ //return 0; for (i = 0; i < m; i++) { u = edges[i].fi; v = edges[i].se; //cout << u << " " << node[u].ll << endl; //cout << v << " " << node[v].ll << endl; if (node[u].ll != node[v].ll) vv[node[u].ll].pb(node[v].ll); } /*for (i = 0; i <= n; i++) { if (vv[i].size() == 0) continue ; cout << i << " ---> "; for (j = 0; j < vv[i].size(); j++) cout << vv[i][j] << " "; cout << endl; cout << ans[i] << endl; }*/ for (i = 0; i <= n; i++) child[i] = -1; for (i = 0; i <= n; i++) { if (!vis[i]) coun[i] = dfs(i); //cout << i << " " << coun[i] << " " << child[i] << endl; } int tmp = 0; for (i = 0; i <= n; i++) { if (out[i].size() == 0) continue ; sort(out[i].begin(), out[i].end()); } int flag = 0; for (i = 0; i <= n; i++) { if (coun[i] == K) { flag = 1; fnc(i); break; } } if (flag) cout << endl; else cout << "-1\n"; } return 0; }