#include <cstdio> #include <vector> #include <algorithm> #include <memory.h> using namespace std; struct edge{int e, nxt;}; int N, K, M; int V, E; #define MAXE 200003 #define MAXV 100003 edge e[MAXE], er[MAXE]; int sp[MAXV], spr[MAXV]; int group_cnt, group_num[MAXV]; bool v[MAXV]; int stk[MAXV]; void fill_forward(int x) { int i; v[x]=true; for(i=sp[x];i;i=e[i].nxt) if(!v[e[i].e]) fill_forward(e[i].e); stk[++stk[0]]=x; } void fill_backward(int x) { int i; v[x]=false; group_num[x]=group_cnt; for(i=spr[x];i;i=er[i].nxt) if(v[er[i].e]) fill_backward(er[i].e); } void add_edge(int v1, int v2) //add edge v1->v2 { e [++E].e=v2; e [E].nxt=sp [v1]; sp [v1]=E; er[ E].e=v1; er[E].nxt=spr[v2]; spr[v2]=E; } void SCC() { int i; stk[0]=0; memset(v, false, sizeof(v)); for(i=1;i<=V;i++) if(!v[i]) fill_forward(i); group_cnt=0; for(i=stk[0];i>=1;i--) if(v[stk[i]]){group_cnt++; fill_backward(stk[i]);} } int main(){ int T; scanf("%d", &T); for (int testcase = 0; testcase < T; testcase++) { scanf("%d %d %d", &N, &M, &K); V = N; E = 0; for (int i = 0; i < MAXE; i++) { e[i] = edge(); er[i] = edge(); } for (int i = 0; i < MAXV; i++) { sp[i] = 0; spr[i] = 0; group_num[i] = 0; v[i] = false; stk[i] = 0; } group_cnt = 0; vector<vector<int> > adj(N+1, vector<int>()); vector<int> targets(K,0); for (int i = 0; i < K; i++) scanf("%d", &(targets[i])); for (int i = 0; i < M; i++) { int u,v; scanf("%d %d", &u, &v); add_edge(u,v); adj[u].push_back(v); } SCC(); /*printf("groups:\n"); printf("%d\n", group_cnt); for (int i = 1; i <= N; i++) printf("%d ", group_num[i]); printf("\n"); */ vector<vector<int> > ADJ(group_cnt + 1, vector<int>()); for (int u = 1; u <= N; u++) for (int v : adj[u]) ADJ[group_num[u]].push_back(group_num[v]); vector<int> X(group_cnt + 1, 0); for (int u : targets) X[group_num[u]]++; vector<int> reachable(group_cnt + 1, 0); for (int i = group_cnt; i >= 1; i--){ for (int v : ADJ[i]) if (reachable[i] <= reachable[v]) reachable[i] = reachable[v]; reachable[i] += X[i]; } int largest = 0; for (int i = 1; i <= group_cnt; i++) if (largest < reachable[i]) largest = reachable[i]; if (largest < K) { printf("-1\n"); continue; } vector<vector<int> > ans(group_cnt + 1, vector<int>()); for (int u : targets) ans[group_num[u]].push_back(u); for (int i = 1; i <= group_cnt; i++) { sort(ans[i].begin(), ans[i].end()); for (int v : ans[i]) printf("%d ", v); } printf("\n"); } }