#include <bits/stdc++.h> using namespace std; #define rep(i, from, to) for (int i = from; i < int(to); ++i) #define trav(a, x) for (auto& a : x) #define all(x) x.begin(), x.end() #define sz(x) (int)(x).size() typedef long long ll; typedef pair<int, int> pii; typedef vector<int> vi; vector<int> val, num, comp; int no_vertices, no_components; stack<int> z; template<class G> void dfs(int j, G &g) { num[j] = val[j] = no_vertices++; comp[j] = 0; z.push(j); trav(e,g[j]) if (comp[e] == -1) { dfs(e, g); num[j] = min(num[j], num[e]); } else if (comp[e] == 0) num[j] = min(num[j], val[e]); if (val[j] == num[j]) { no_components++; while (true) { comp[z.top()] = no_components; if (z.top() == j) { z.pop(); break; } z.pop(); } } } template<class G> vector<int> go(G &g) { int n = sz(g); val.assign(n, 0); num = val; no_vertices = no_components = 0; comp.assign(n, -1); rep(i,0,n) if (comp[i] == -1) dfs(i, g); rep(i,0,n) comp[i]--; return comp; } template <class E, class I> bool topo_sort(const E& edges, vi& prio, I &order, int n) { vector<int> indeg(n); rep(i,0,n) trav(e, edges[i]) indeg[e]++; struct Cmp { vi& prio; Cmp(vi& prio) : prio(prio) {} bool operator()(int a, int b) { return prio[a] > prio[b]; } }; Cmp cmp(prio); priority_queue<int, vi, Cmp> q(cmp); rep(i,0,n) if (indeg[i] == 0) q.push(i); // , cerr << "init add " << i << endl; int nr = 0; while (q.size() > 0) { int i = q.top(); order[nr++] = i; q.pop(); // cerr << "set " << i << endl; if (!q.empty() && prio[i] != -1) return false; trav(e, edges[i]) if (--indeg[e] == 0) q.push(e); // , cerr << "then add " << e << endl; } assert(nr == n); return true; } void solve() { int N, M, K; cin >> N >> M >> K; vi qs(K); rep(i,0,K) cin >> qs[i], --qs[i]; vector<vi> g(N); rep(i,0,M) { int a, b; cin >> a >> b; --a, --b; g[a].push_back(b); } vi comp = go(g); int ncomps = no_components; vi prio(ncomps, N); trav(q, qs) { prio[comp[q]] = min(prio[comp[q]], q); } rep(i,0,ncomps) if (prio[i] == N) prio[i] = -1; vector<vi> ed2(ncomps); rep(i,0,N) { trav(j, g[i]) { if (comp[i] != comp[j]) ed2[comp[i]].push_back(comp[j]); } } // cout << "comp: "; rep(i,0,N) cout << comp[i] << ' '; cout << endl; // cout << "prio: "; rep(i,0,ncomps) cout << prio[i] << ' '; cout << endl; // rep(i,0,ncomps) { cout << i << ": "; trav(j, ed2[i]) cout << j << ' '; cout << endl; } vi out(ncomps); if (!topo_sort(ed2, prio, out, ncomps)) { cout << -1 << endl; } else { // cout << "order:"; rep(oi,0,ncomps) cout << ' ' << out[oi]; cout << endl; vector<vi> compconts(ncomps); trav(q, qs) compconts[comp[q]].push_back(q); rep(oi,0,ncomps) { int i = out[oi]; vi& conts = compconts[i]; sort(all(conts)); trav(c, conts) cout << c+1 << ' '; } cout << endl; } } int main() { cin.sync_with_stdio(false); int N; cin >> N; rep(i,0,N) solve(); }