#include <iostream> #include <vector> #include <algorithm> using namespace std; const int MAXn = 1e5+10; int n, m, k; vector<int> v; vector<int> nb[MAXn], nb_rev[MAXn], nb_comp[MAXn]; bool mark[MAXn]; vector<int> ordered; int comp[MAXn]; bool reach[MAXn]; void dfs(int v) { mark[v] = true; for(int i = 0; i < (int)nb[v].size(); i++) { if(!mark[nb[v][i]]) dfs(nb[v][i]); } ordered.push_back(v); } int cur_comp; void dfs_rev(int v) { mark[v] = true; comp[v] = cur_comp; for(int i = 0; i < (int)nb_rev[v].size(); i++) { if(!mark[nb_rev[v][i]]) { dfs_rev(nb_rev[v][i]); } } } int main() { ios::sync_with_stdio(false); int T; for(cin >> T; T > 0; T--) { cin >> n >> m >> k; v.clear(); for(int i = 0; i < k; i++) { int x; cin >> x; x--; v.push_back(x); } for(int i = 0; i < n; i++) { nb[i].clear(); nb_rev[i].clear(); nb_comp[i].clear(); reach[i] = false; } for(int i = 0; i < m; i++) { int v, u; cin >> v >> u; v--; u--; nb[v].push_back(u); nb_rev[u].push_back(v); } for(int i = 0; i < n; i++) mark[i] = false; ordered.clear(); for(int i = 0; i < n; i++) if(!mark[i]) dfs(i); for(int i = 0; i < n; i++) mark[i] = false; cur_comp = 0; for(int i = n-1; i >= 0; i--) { if(!mark[ordered[i]]) { dfs_rev(ordered[i]); cur_comp++; } } for(int i = 0; i < n; i++) { for(int j = 0; j < (int)nb[i].size(); j++) { if(comp[i] != comp[nb[i][j]]) nb_comp[comp[i]].push_back(comp[nb[i][j]]); } } vector<pair<int,int> > s; for(int i = 0; i < (int)v.size(); i++) { s.push_back(make_pair(comp[v[i]], v[i])); } sort(s.begin(), s.end()); bool f = true; for(int i = k-2; i >= 0; i--) { if(s[i].first == s[i+1].first) continue; reach[s[i+1].first] = true; for(int j = s[i+1].first-1; j >= s[i].first; j--) { for(int k = 0; k < (int)nb_comp[j].size(); k++) { if(reach[nb_comp[j][k]]) { reach[j] = true; break; } } } if(!reach[s[i].first]) { f = false; break; } for(int j = s[i+1].first; j >= s[i].first; j--) reach[j] = false; } if(!f) { cout << -1 << endl; continue; } for(int i = 0; i < (int)s.size(); i++) cout << s[i].second+1 << " "; cout << endl; } return 0; }