#include <bits/stdc++.h> using namespace std; #define PB push_back #define MP make_pair #define SZ size() #define all(v) v.begin(), v.end() #define REP(i, n) for(int i = 0; i < (int)n; i++) #define ITR(i, j, n) for(int i = j; i < (int)n; i++) #define mem(array, val) memset(array, val, sizeof(array)) #define READ(filename) freopen(filename, "r", stdin) #define WRITE(filename) freopen(filename, "w", stdout) #define Pii pair <int, int> #define Fr first #define Sc second #define Long long long #define si(a) scanf("%d", &a) #define sl(a) scanf("%lld", &a) #define sd(a) scanf("%lf", &a) #define sii(a, b) scanf("%d%d", &a, &b) #define sll(a, b) scanf("%lld%lld", &a, &b) #define sdd(a, b) scanf("%lf%lf", &a, &b) #define Fast_IO ios_base::sync_with_stdio(0);cin.tie(0) #define MAX 100005 int N, M, K; bool inStack[MAX], dlv[MAX], mark[MAX]; int disc[MAX], low[MAX], comp[MAX], components, Tm; vector <int> adj[MAX]; vector < vector <int> > vec; stack <int> S; set <int, greater<int> > st[MAX]; void dfs(int nd) { disc[nd] = low[nd] = ++Tm; S.push(nd); inStack[nd] = true; REP(i, adj[nd].SZ) { int ch = adj[nd][i]; if(!disc[ch]) { dfs(ch); low[nd] = min(low[nd], low[ch]); } else if(inStack[ch]) { low[nd] = min(low[nd], disc[ch]); } } if(low[nd] == disc[nd]) { comp[nd] = components++; int u; vector <int> tmp; do { u = S.top(); S.pop(); inStack[u] = false; comp[u] = comp[nd]; if(dlv[u]) { tmp.PB(u); dlv[u] = 0; } } while(u != nd); vec.PB(tmp); } } bool find(int nd, int dest) { if(nd == dest) return true; //cout << nd << ' ' << dest << endl; bool ret = false; mark[nd] = true; for(set <int, greater <int> >::iterator it = st[nd].begin(); it != st[nd].end(); it++) { if(*it < dest || mark[*it] == true) continue; ret |= find(*it, dest); if(ret) return ret; } return ret; } void init() { mem(inStack, 0); mem(dlv, 0); mem(mark, 0); mem(disc, 0); mem(low, 0); components = Tm = 0; REP(i, MAX) { adj[i].clear(); st[i].clear(); } vec.clear(); } void print_SCC() { REP(i, vec.SZ) { printf("Comp: %d\n", i); REP(j, vec[i].SZ) { if(j) printf(" "); printf("%d", vec[i][j]); } puts(""); } } void solve() { ITR(i, 1, N+1) if(!disc[i]) dfs(i); //print_SCC(); ITR(i, 1, N+1) REP(j, adj[i].SZ) if(comp[i] != comp[ adj[i][j] ]) { st[ comp[i] ].insert(comp[ adj[i][j] ]); } vector <int> ans; int prev = -1; for(int i = components-1; i >= 0; i--) if(vec[i].SZ > 0) { if(prev != -1 && find(prev, i) == false) { printf("-1\n"); return; } sort(all(vec[i])); REP(j, vec[i].SZ) ans.PB(vec[i][j]); prev = i; } REP(i, ans.SZ) { if(i) printf(" "); printf("%d", ans[i]); } puts(""); } int main() { int t; si(t); while(t--) { init(); sii(N, M); si(K); REP(i, K) { int u; si(u); dlv[u] = 1; } REP(i, M) { int u, v; sii(u, v); adj[u].PB(v); } solve(); } return 0; }