#include<iostream> #include<vector> #include<algorithm> #include<queue> using namespace std; vector<int>g[100007], gg[100007]; vector<int>dag[100007]; bool used[100007]; int scc[100007]; vector<int>topsort; void dfs1(int v) { used[v] = true; for (int i = 0; i < g[v].size(); i++) { int to = g[v][i]; if (!used[to]) { dfs1(to); } } topsort.push_back(v); } void dfs2(int v, int c) { used[v] = true; scc[v] = c; for (int i = 0; i < gg[v].size(); i++) { int to = gg[v][i]; if (!used[to]) { dfs2(to, c); } } } bool cmp(int x, int y) { if (scc[x] != scc[y]) { return scc[x] < scc[y]; } return x < y; } int dp[100007]; int goscc[100007]; int main() { //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); int t; scanf("%d", &t); for (int tt = 1; tt <= t; tt++) { int n, m, k; scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= n; i++) { g[i].clear(); gg[i].clear(); dag[i].clear(); used[i] = false; scc[i] = 0; dp[i] = 0; goscc[i] = 0; } vector<int>go(k); vector<pair<int, int> >edges; for (int i = 0; i < k; i++) { scanf("%d", &go[i]); } for (int i = 1; i <= m; i++) { int u, v; scanf("%d%d", &u, &v); edges.push_back(make_pair(u, v)); g[u].push_back(v); gg[v].push_back(u); } for (int i = 1; i <= n; i++) { if (!used[i]) { dfs1(i); } } int comp = 0; for (int i = 1; i <= n; i++) { used[i] = false; } reverse(topsort.begin(), topsort.end()); for (int i = 0; i < topsort.size();i++) { int u = topsort[i]; if (!used[u]) { comp++; dfs2(u, comp); } } sort(go.begin(), go.end(), cmp); int tmp = 0; int beg = 0; for (int i = 0; i < go.size(); i++) { if (i == 0 || scc[go[i]] != scc[go[i - 1]]) { tmp++; if (tmp == 1) { beg = scc[go[i]]; } goscc[scc[go[i]]] = tmp; } } for (int i = 0; i < edges.size(); i++) { int u = scc[edges[i].first], v = scc[edges[i].second]; dag[u].push_back(v); } for (int i = 1; i <= n; i++) { used[i] = false; } dp[beg] = 1; queue<int>q; q.push(beg); while (!q.empty()) { int cur = q.front(); q.pop(); for (int i = 0; i < dag[cur].size(); i++) { int to = dag[cur][i]; int nxtdp = dp[cur]; if (dp[cur] + 1 == goscc[to]) { nxtdp++; } else if (goscc[to] != 0) { nxtdp = -1000; } if (nxtdp>dp[to]) { dp[to] = nxtdp; q.push(to); } } } bool ok = false; for (int i = 1; i <= n; i++) { if (dp[i] == tmp) { ok = true; } } if (ok) { for (int i = 0; i < go.size(); i++) { printf("%d ", go[i]); } printf("\n"); } else { printf("-1\n"); } } }