#include<bits/stdc++.h> #define mp make_pair #define pb push_back #define F first #define S second #define MOD 1000000007 #define ZERO 1e-9 using namespace std; typedef vector<int> vi; vi dfs_num, dfs_low, s, visited; int dfsNumberCounter, numSCC; vector<vector<int> > g, adj; int scc[100100]; void tarjanSCC(int u) { dfs_low[u] = dfs_num[u] = dfsNumberCounter++, s.push_back(u), visited[u] = 1; for (int j = 0; j < (int) adj[u].size(); j++) { int v = adj[u][j]; if (dfs_num[v] == false) tarjanSCC(v); if (visited[v]) dfs_low[u] = min(dfs_low[u], dfs_low[v]); } if (dfs_low[u] == dfs_num[u]) { vector<int> x; while (1) { int v = s.back(); s.pop_back(), visited[v] = 0, x.pb(v), scc[v] = numSCC; if (u == v) break; } g.pb(x); ++numSCC; } } vector<vector<int>> content; vector<unordered_set<int>> gc; vector<int> order; int n, m, k, a, b; void buildGraph() { content.resize(g.size()); gc.resize(g.size()); for (int i = 0; i < k; i++) { content[scc[order[i]]].push_back(order[i]); } int from, to; for (int i = 1; i <= n; i++) { from = scc[i]; for (int j = 0; j < (int)adj[i].size(); j++) { to = scc[adj[i][j]]; gc[from].insert(to); } } } int nt[100100], sum[100100]; int bfs(int node) { if (sum[node] != -1) return sum[node]; int ans = content[node].size(); int s = content[node].size(); for (unordered_set<int>::iterator it = gc[node].begin(); it != gc[node].end(); it++) { if(node != *it) { if (ans < bfs(*it) + s) { ans = bfs(*it) + s; nt[node] = *it; } } } return sum[node] = ans; } ostringstream foo; void solve() { dfs_num.clear(); dfs_low.clear(); visited.clear(); adj.clear(); gc.clear(); content.clear(); order.clear(); dfs_num.assign(100100, false); dfs_low.assign(100100, 0); visited.assign(100100, 0); dfsNumberCounter = numSCC = 0; adj.resize(100100); cin >> n >> m >> k; for (int i = 0; i < k; i++) cin >> a, order.pb(a); for (int i = 0; i < m; i++) cin >> a >> b, adj[a].pb(b); for (int i = 1; i <= n; i++) if (dfs_num[i] == false) tarjanSCC(i); buildGraph(); memset(nt, -1, sizeof nt); memset(sum, -1, sizeof sum); int max = 0; int indx = -1; for (int i = 0; i < (int)g.size() && max != k; i++) { if (max < bfs(i)) { max = bfs(i); indx = i; } } if (max != k) { foo << "-1\n"; } else { int cc = 0; while (indx != -1) { sort(content[indx].begin(), content[indx].end()); cc += content[indx].size(); for(int i = 0;i < (int)content[indx].size(); i++) { foo<<content[indx][i]<<" "; } indx = nt[indx]; } foo << endl; } } int main(int argc, char **argv) { // freopen("input.txt", "r", stdin); int t; cin>>t; while(t--) { solve(); } cout<<foo.str(); return 0; }