#include <cstdio> #include <cstring> #include <algorithm> #include <vector> #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)-1; i>=(e); i--) #define CLR(a,x) memset(a, x, sizeof(a)) #define EXP(i,l) for (int i=(l); i; i=qn[i]) #define N 100005 using namespace std; int n, ne, nq, t, sz, m, x, y, ed, nxt, ITR, st; int a[N], stk[N], w[N], l[N], v[N], scc[N], act[N], L[N], rk[N], q[N], sol[N]; int qd[N*4], qn[N*4], use[N]; vector<int> List[N]; void dfs(int x){ v[x] = w[x] = ++t; stk[++sz] = x, act[x] = 1; for (int i=l[x]; i; i=qn[i]){ if (!v[qd[i]]) dfs(qd[i]), w[x] = min(w[x], w[qd[i]]); else if (act[qd[i]]) w[x] = min(w[x], v[qd[i]]); } if (v[x] == w[x]){ m++; do{ scc[stk[sz]] = m; act[stk[sz]] = 0; } while (stk[sz--] != x); } } void Tsort(int x){ v[x] = 1; EXP(i,L[x]) if (!v[qd[i]]) Tsort(qd[i]); rk[x] = t--; } void Flood(int x){ v[x] = ITR; /* candidate SCC here */ if (x != st && use[x]){ if (nxt == -1) nxt = x; else if (rk[x] < rk[nxt]) nxt = x; return; } EXP(i,L[x]) if (v[qd[i]] != ITR) Flood(qd[i]); } void solve(){ scanf("%d%d%d", &n, &ne, &nq); FOR(i,0,nq) scanf("%d", &a[i]), --a[i]; sort(a, a + nq); FOR(i,0,n) l[i] = v[i] = 0; t = sz = m = ed = 0; FOR(i,0,ne){ ++ed; scanf("%d%d", &x, &qd[ed]); --x, --qd[ed]; qn[ed] = l[x]; l[x] = ed; } FOR(i,0,n) if (!v[i]) dfs(i); FOE(i,1,m){ use[i] = L[i] = v[i] = 0; List[i].clear(); } FOR(i,0,nq){ use[scc[a[i]]] = 1; List[scc[a[i]]].push_back(a[i]); } // t-sort the SCCs now FOR(i,0,n) EXP(j,l[i]){ ++ed; qd[ed] = scc[qd[j]]; qn[ed] = L[scc[i]]; L[scc[i]] = ed; } t = m; FOE(i,1,m) if (!v[i]) Tsort(i); // FOR(i,0,n) printf("%d scc %d\n", i, scc[i]); // FOE(i,1,m) printf("%d rank %d use %d\n", i, rk[i], use[i]); st = -1; FOE(i,1,m) if (use[i] && (st == -1 || rk[i] < rk[st])) st = i; FOE(i,1,m) v[i] = 0; q[0] = st; t = 1; while (1){ ++ITR; nxt = -1; Flood(st); if (nxt == -1) break; q[t++] = nxt; st = nxt; } int solsz = 0; FOR(i,0,t){ int x = q[i]; FOR(j,0,List[x].size()) sol[solsz++] = List[x][j]; } if (solsz < nq) goto FAIL; FOR(i,0,solsz) printf("%d%c", sol[i] + 1, i == solsz-1 ? '\n' : ' '); return; FAIL: puts("-1"); } int main(){ int tc; scanf("%d", &tc); while (tc--) solve(); return 0; }