/* Man Mohan Mishra aka m17 IIIT - Allahabad */ #include <cstdio> #include <cmath> #include <cstring> #include <climits> #include <cstdlib> #include <cctype> #include <iostream> #include <algorithm> #include <utility> #include <string> #include <vector> #include <map> #include <list> #include <stack> #include <queue> #include <set> #include <iterator> #define MOD 1000000007 #define INF 1000000000000000000 #define PI acos(-1) using namespace std; long long GCD (long long a,long long b) { if (b == 0) return a; return(a % b == 0 ? b : GCD(b,a % b)); } long long POW (long long base,long long exp) { long long val; val = 1; while (exp > 0) { if (exp % 2 == 1) { val = (val * base) % MOD; } base = (base * base) % MOD; exp = exp / 2; } return val; } vector <int> in[100005]; vector <int> out[100005]; int marked[100005]; int ds[100005]; int vis[100005]; stack <int> st; vector <int> adj[100005]; int useful[100005]; int dp[100005]; int par[100005]; int cur; vector <int> necc[100005]; void dfs1 (int id) { int i,sz; vis[id] = 1; sz = out[id].size(); for (i = 0; i < sz; i++) { if (vis[out[id][i]] == 0) { dfs1(out[id][i]); } } st.push(id); } void dfs2 (int id) { int i,sz; vis[id] = 1; ds[id] = cur; sz = in[id].size(); for (i = 0; i < sz; i++) { if (vis[in[id][i]] == 0) { dfs2(in[id][i]); } else { if (ds[in[id][i]] != cur) { adj[ds[in[id][i]]].push_back(cur); } } } } int dfs3 (int id) { int i,sz,val; if (dp[id] != -1) return dp[id]; dp[id] = 0; par[id] = -1; sz = adj[id].size(); for (i = 0; i < sz; i++) { val = dfs3(adj[id][i]); if (val > dp[id]) { dp[id] = val; par[id] = adj[id][i]; } } dp[id] = dp[id] + useful[id]; return dp[id]; } int main() { int t; scanf("%d",&t); while (t --) { int n,m,k,x,y,i,j,sz,id,tot_useful; scanf("%d%d%d",&n,&m,&k); memset(marked,0,sizeof(marked)); for (i = 0; i < k; i++) { scanf("%d",&x); marked[x] = 1; } for (i = 1; i <= n; i++) { in[i].clear(); out[i].clear(); } for (i = 0; i < m; i++) { scanf("%d%d",&x,&y); in[y].push_back(x); out[x].push_back(y); } memset(vis,0,sizeof(vis)); for (i = 1; i <= n; i++) { if (vis[i] == 0) { dfs1(i); } } memset(vis,0,sizeof(vis)); memset(ds,-1,sizeof(ds)); cur = 0; while (!st.empty()) { id = st.top(); st.pop(); if (vis[id] == 1) continue; cur++; adj[cur].clear(); dfs2(id); } memset(useful,0,sizeof(useful)); for (i = 1; i <= cur; i++) { necc[i].clear(); } for (i = 1; i <= n; i++) { if (marked[i] == 1) { useful[ds[i]] = 1; necc[ds[i]].push_back(i); } } for (i = 1; i <= cur; i++) { sort(necc[i].begin(),necc[i].end()); } tot_useful = 0; for (i = 1; i <= cur; i++) { tot_useful = tot_useful + useful[i]; } memset(dp,-1,sizeof(dp)); for (i = 1; i <= cur; i++) { if (useful[i] == 1 && dp[i] == -1) { int temp = dfs3(i); if (dp[i] == tot_useful) { break; } } } if (dp[i] != tot_useful) { printf("-1\n"); continue; } while (i != -1) { sz = necc[i].size(); for (j = 0; j < sz; j++) { printf("%d ",necc[i][j]); } i = par[i]; } printf("\n"); } return 0; }