#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");
}
}