#include <bits/stdc++.h> using namespace std; vector< vector<int>> res; vector<int> adj[100001], cadj[100001]; int idx; int tempo[100001], in_comp[100001], lowlink[100001]; stack<int> s; int n, m, k; vector<int> cities; bool chas[100001], has[100001]; bool visited[100001]; int best[100001]; int scc(int i){ lowlink[i] = tempo[i] = ++idx; s.push(i); for(int k : adj[i]){ if(!tempo[k]) lowlink[i] = min(lowlink[i], scc(k)); else if(tempo[k] > 0) // on stack lowlink[i] = min(lowlink[i], lowlink[k]); } if(lowlink[i] == tempo[i]){ vector<int> comp; int c = res.size(); int k; do{ k = s.top(); s.pop(); comp.push_back(k); in_comp[k] = c; tempo[k] = -1; }while(k != i); res.push_back(comp); } return lowlink[i]; } void tarjan(){ idx = 0; s = stack<int>(); res.clear(); for(int i = 0; i < n; i++){ if(!tempo[i]) scc(i); } } void contract(){ memset(visited, 0, sizeof visited); for(int i = 0; i < res.size(); i++){ sort(res[i].begin(), res[i].end()); visited[i] = true; for(int u : res[i]) for(int v : adj[u]) if(!visited[in_comp[v]]) { cadj[i].push_back(in_comp[v]); visited[in_comp[v]] = true; } for(int u : res[i]) for(int v : adj[u]) visited[in_comp[v]] = false; visited[i] = false; for(int u : res[i]) chas[i] |= has[u]; } } int dfs(int u){ visited[u] = true; for(int v : cadj[u]){ if(chas[v]){ best[u] = max(best[u], v); if(!visited[v]) dfs(v); best[u] = max(best[u], best[v]); } else if(visited[v]) best[u] = max(best[u], best[v]); else best[u] = max(best[u], dfs(v)); } return best[u]; } void init(){ for(int i = 0; i < n; i++) adj[i].clear(), cadj[i].clear(); memset(tempo, 0, sizeof tempo); memset(visited, 0, sizeof visited); memset(lowlink, 0, sizeof lowlink); cities.clear(); memset(chas, 0, sizeof chas); memset(has, 0, sizeof has); } void solve(){ init(); scanf("%d%d%d", &n, &m, &k); for(int i = 0; i < k; i++){ int x; scanf("%d", &x); --x; cities.push_back(x); has[x] = true; } for(int i = 0; i < m; i++){ int u, v; scanf("%d%d", &u, &v); --u, --v; adj[u].push_back(v); } tarjan(); contract(); set<int, greater<int>> tmp; for(int u : cities) tmp.insert(in_comp[u]); vector<int> cc(tmp.begin(), tmp.end()); memset(visited, 0, sizeof visited); memset(best, -1, sizeof best); for(int i = 0; i < res.size(); i++) if(!visited[i]) dfs(i); bool ok = true; for(int i = 1; i < cc.size(); i++){ ok &= best[cc[i-1]] == cc[i]; } if(!ok){ puts("-1"); }else{ for(int i : cc){ for(int j : res[i]){ if(has[j]) printf("%d ", j+1); } } puts(""); } } int main(){ int T; scanf("%d", &T); while(T--){ solve(); } }