#include <cstdio> #include <cstdlib> #include <algorithm> #include <queue> #include <cmath> #include <iostream> #include <set> #include <fstream> #include <string> #include <vector> using namespace std; #define FOR(i,s,e) for (int i=(s); i<(e); i++) #define FOE(i,s,e) for (int i=(s); i<=(e); i++) #define FOD(i,s,e) for (int i=(s); i>=(e); i--) #define LL long long #define eps 1e-9 #define pi acos(-1.0) LL max(LL a,LL b){if (a>b){return a;} else {return b;}} LL min(LL a,LL b){if (a<b){return a;} else {return b;}} vector<int> nxt[200001], bac[200001]; vector<int> nn[200001]; int od[200001], ys[200001]; int QQ[200001], top, tail; vector<int> have[200001]; int par[200001]; int n, taken; int m, k, cnt; vector<int> Q, S, Z; int visit[200001], rep[200001], ok[200001]; int pp; void DFS(int u){ visit[u] = 1; FOR(i, 0, nxt[u].size()) if (!visit[nxt[u][i]]) DFS(nxt[u][i]); S.push_back(u); } void DFS2(int color, int u){ // printf("GROUP %d INTO %d\n", u, color); visit[u] = 2; have[color].push_back(u); rep[u] = color; FOR(i, 0, bac[u].size()) if (visit[bac[u][i]] == 1) DFS2(color, bac[u][i]); } int fail; int head; void DFS3(int u){ od[u] = -1; sort(have[u].begin(), have[u].end()); FOR(i, 0, have[u].size()) if (ok[have[u][i]]) Z.push_back(have[u][i]); FOR(i, 0, nn[u].size()){ od[nn[u][i]]--; if (od[nn[u][i]] == 0) { if (ys[nn[u][i]]){ QQ[top++] = nn[u][i]; if (top - tail >= 2) fail = 1; } else DFS3(nn[u][i]); } } } void solve(){ scanf("%d%d%d", &n, &m, &k); while (Q.size()) Q.pop_back(); while (S.size()) S.pop_back(); while (Z.size()) Z.pop_back(); FOE(i, 1, 200000) while (nxt[i].size()) nxt[i].pop_back(); FOE(i, 1, 200000) while (have[i].size()) have[i].pop_back(); FOE(i, 1, 200000) while (nn[i].size()) nn[i].pop_back(); FOE(i, 1, 200000) while (bac[i].size()) bac[i].pop_back(); FOE(i, 1, 200000) od[i] = ys[i] = ok[i] = visit[i] = 0; FOE(i, 1, k){ int t; scanf("%d", &t); ok[t] = 1; Q.push_back(t); } FOE(i, 1, m){ int a, b; scanf("%d%d", &a, &b); if (a != b){ nxt[a].push_back(b); bac[b].push_back(a); } } FOE(i, 1, n) if (!visit[i]) DFS(i); cnt = pp = taken = fail = 0; // FOR(i, 0, S.size()) printf("%d ", S[i]); // puts(""); FOD(i, n - 1, 0) if (visit[S[i]] == 1){ DFS2(++cnt, S[i]); } FOE(i, 1, n) FOR(j, 0, nxt[i].size()) if (rep[i] != rep[nxt[i][j]]){ nn[rep[i]].push_back(rep[nxt[i][j]]); od[rep[nxt[i][j]]]++; } FOR(i, 0, k) ys[rep[Q[i]]] = 1; FOE(i, 1, cnt) if (ys[i]) pp++; FOE(i, 1, cnt) par[i] = -1; head = -1; top = tail = fail = 0; FOE(i, 1, cnt) if (od[i] == 0){ DFS3(i); while (top > tail){ DFS3(QQ[tail++]); } } if (fail){ puts("-1"); return; } FOR(i, 0, Z.size() - 1) printf("%d ", Z[i]); printf("%d\n", Z[Z.size() - 1]); } int main(){ // freopen("out.txt", "r", stdin); int t; scanf("%d", &t); while (t--) solve(); return 0; }