#include <cstdio> #include <vector> #include <string.h> #include <algorithm> #include <vector> #include <bitset> using namespace std; #define N 410000 int n, m, a, b, L, Time, len, j, k, till[N], to[N], dfn[N], low[N], go[N], Next[N], zhan[N * 2], ans[N], n1[N], ord[N], de[N]; bool in[N], used[N]; vector <int> ve[N]; bool cmp(int x, int y) { if (to[x] == to[y]) return x < y; else return ord[to[x]] < ord[to[y]]; } void add(int x, int y) { Next[++len] = till[x]; till[x] = len; go[len] = y; } void xiao(int k) { zhan[zhan[0] + 1] = 0; L++; while (zhan[zhan[0] + 1] != k) { to[zhan[zhan[0]]] = L; in[zhan[zhan[0]]] = false; zhan[0]--; } } void tarjan(int k) { dfn[k] = low[k] = ++Time; in[k] = true; zhan[++zhan[0]] = k; for (int i = till[k]; i; i = Next[i]) if (!dfn[go[i]]) tarjan(go[i]), low[k] = min(low[k], low[go[i]]); else if (in[go[i]]) low[k] = min(low[k], dfn[go[i]]); if (low[k] == dfn[k]) xiao(k); } bool can(int x, int y) { int q, h; n1[q = h = 1] = x; used[x] = true; for (q = 1; q <= h; q++) { for (int i = 0; i < (int) ve[n1[q]].size(); i++) { int k = ve[n1[q]][i]; if (!used[k] && ord[x] <= ord[k] && ord[k] <= ord[y]) used[n1[++h] = k] = true; } } bool tt = used[y]; for (int i = 1; i <= h; i++) used[n1[i]] = false; return tt; } int main() { int T; scanf("%d", &T); while (T--) { memset(low, 0, sizeof low); memset(dfn, 0, sizeof dfn); memset(till, 0, sizeof till); memset(in, false, sizeof in); memset(zhan, 0, sizeof zhan); len = L = Time = 0; scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= k; i++) scanf("%d", &ans[i]); for (int i = 1; i <= m; i++) { scanf("%d%d", &a, &b); add(a, b); } for (int i = 1; i <= n; i++) if (!dfn[i]) tarjan(i); for (int i = 1; i <= L; i++) de[i] = 0, ve[i].clear(); for (int i = 1; i <= n; i++) for (int j = till[i]; j; j = Next[j]) if (to[i] != to[go[j]]) ve[to[i]].push_back(to[go[j]]), de[to[go[j]]]++; int q, h = 0; for (int i = 1; i <= L; i++) if (!de[i]) n1[++h] = i, ord[i] = h; for (q = 1; q <= h; q++) for (int i = 0; i < (int) ve[n1[q]].size(); i++) { --de[ve[n1[q]][i]]; if (!de[ve[n1[q]][i]]) { h++; n1[h] = ve[n1[q]][i]; ord[ve[n1[q]][i]] = h; } } sort(ans + 1, ans + k + 1, cmp); bool ok = true; for (int i = 1; i < k; i++) if (to[ans[i]] != to[ans[i + 1]] && !can(to[ans[i]], to[ans[i + 1]])) ok = false; if (!ok) printf("-1\n"); else { for (int i = 1; i <= k; i++) { printf("%d", ans[i]); if (i < k) printf(" "); else printf("\n"); } } } }