#include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algorithm> #include <cstring> using namespace std; typedef pair<int, int> pii; vector<vector<int>> adj; vector<vector<int>> adj2; bool visited[100005]; vector<int> order; void dfs(int p){ visited[p] = true; for(int u : adj2[p]){ if(!visited[u]) dfs(u); } order.push_back(p); } int counter = 0; int scc[100005]; vector<vector<int>> sccadj; int main() { /* Enter your code here. Read input from STDIN. Print output to STDOUT */ int T; cin >> T; for(int tc=0;tc<T;tc++){ memset(visited, false, sizeof(visited)); counter = 0; order = vector<int>(); memset(scc, 0, sizeof(scc)); int N; int M; int K; cin >> N >> M >> K; adj = vector<vector<int>>(N+2); adj2 = vector<vector<int>>(N + 2); sccadj = vector<vector<int>>(N+2); vector<int> visits; for(int k=0;k<K;k++){ int t; cin >> t; visits.push_back(t); } for(int m=0;m<M;m++){ int u; int v; cin >> u >> v; adj[u].push_back(v); adj2[v].push_back(u); } for(int i=1;i<=N;i++){ if(!visited[i]) dfs(i); } memset(visited, false, sizeof(visited)); reverse(order.begin(), order.end()); for(int v : order){ //cout << v << "!!\n"; if(visited[v]) continue; counter++; vector<int> Q; Q.push_back(v); while(!Q.empty()){ int u = Q.back(); Q.pop_back(); if(visited[u]){ if(scc[u] != counter){ sccadj[counter].push_back(scc[u]); } continue; } visited[u] = true; scc[u] = counter; for(int x : adj[u]){ Q.push_back(x); } } sort(sccadj[counter].begin(), sccadj[counter].end()); } vector<pii> ans; for(int k : visits){ ans.push_back(pii(-scc[k], k)); } sort(ans.begin(), ans.end()); //the answer is either this or -1. vector<int> relevant; for(pii i : ans){ if(relevant.empty() || relevant.back() != -i.first){ relevant.push_back(-i.first); } } memset(visited, false, sizeof(visited)); int k = 0; vector<int> Q; Q.push_back(relevant[k]); while(!Q.empty()){ int u = Q.back(); Q.pop_back(); if(visited[u]){ continue; } visited[u] = true; if(u == relevant[k + 1]){ Q = vector<int>(); k++; Q.push_back(relevant[k]); if(k == relevant.size() - 1) break; } for(int x : sccadj[u]){ if(!visited[x]) Q.push_back(x); } } bool fail = false; for(int r : relevant){ if(!visited[r]){ fail = true; break; } } if(fail){ cout << -1 << "\n"; } else{ for(pii i : ans){ cout << i.second << " "; } cout << "\n"; } } return 0; }