/* 

   SHUBHAM RAI-IIIT Hyderabad

 */
#include<bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(i=a;i<b;i++)
#define REP(i,a) for(i=0;i<a;i++)
#define LLD long long int
#define MOD 1000000007
#define si(n) scanf("%d",&n);
#define si2(n,m) scanf("%d%d",&n,&m);
#define sl(n) scanf("%lld",&n);
#define TR(container,it) for(typeof(container.begin()) it=container.begin();it!=container.end();it++)
#define F first
#define S second
#define pb push_back
#define mp make_pair
typedef pair<int,int> PII;
#define TRACE

#ifdef TRACE
#define trace1(x)                cerr << #x << ": " << x << endl;
#define trace2(x, y)             cerr << #x << ": " << x << " | " << #y << ": " << y << endl;
#define trace3(x, y, z)          cerr << #x << ": " << x << " | " << #y << ": " << y << " | " << #z << ": " << z << endl;
#define trace4(a, b, c, d)       cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " << #d << ": " << d << endl;
#define trace5(a, b, c, d, e)    cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " << #d << ": " << d << " | " << #e << ": " << e << endl;
#define trace6(a, b, c, d, e, f) cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " << #d << ": " << d << " | " << #e << ": " << e << " | " << #f << ": " << f << endl;

#else

#define trace1(x)
#define trace2(x, y)
#define trace3(x, y, z)
#define trace4(a, b, c, d)
#define trace5(a, b, c, d, e)
#define trace6(a, b, c, d, e, f)

#endif

vector<int> G[100010],RG[100010],NG[100010],same[100010],order;
int v[100010],ans[100010],id,tovisit[100010],tovisit1[100010],cnt[100010],c1,path[100010];			
stack<int> topo;
void init()
{
	int i;
	REP(i,100002)
	{
		same[i].clear();
		G[i].clear();RG[i].clear();NG[i].clear();
		ans[i]=0;
		v[i]=0;	tovisit[i]=0;	tovisit1[i]=0;
		cnt[i]=path[i]=0;
	}
	c1=0;
	id=1;
	order.clear();
}
void dfs1(int x)
{
	if(v[x])
		return;
	v[x]=1;
	int i;
	REP(i,G[x].size())
		dfs1(G[x][i]);
	order.pb(x);
}
void dfs2(int x)
{
	if(v[x]==2)
		return;
	v[x]=2;
	int i;
	REP(i,RG[x].size())
		dfs2(RG[x][i]);
	same[id].pb(x);
	ans[x]=id;
}
void scc(int n)
{
	int i,j;
	FOR(i,1,n+1)
		dfs1(i);
	for(i=n-1;i>-1;i--)
	{
		if(v[order[i]]!=2)
		{
			dfs2(order[i]);
			id++;
		}
	}
//	FOR(i,1,n+1)
//		printf("%d %d\n",i,ans[i]);
	return;
}
void dfs3(int n)
{
	if(v[n])
		return;
	v[n]=1;
	int i,l=NG[n].size();
	for(i=0;i<l;i++)
	{
		int x=NG[n][i];
		dfs3(x);
		path[n]=max(path[n],path[x]);
	}
	if(tovisit1[n])
		path[n]++;
	c1=max(path[n],c1);
	topo.push(n);
}
int main()
{
	int t;
	si(t);
	while(t--)
	{
		int n,m,k,i,j;
		cin>>n>>m>>k;
		init();
		REP(i,k)
		{
			int x;
			si(x);
			tovisit[x]=1;
		}
		REP(i,m)
		{
			int x,y;
			si2(x,y);
			G[x].pb(y);
			RG[y].pb(x);
		}
		scc(n);
		FOR(i,1,n+1)
			if(tovisit[i])
				tovisit1[ans[i]]=1;
		FOR(i,1,n+1)
		{
			int l=G[i].size();
			REP(j,l)
			{
				int x=G[i][j];
				if(ans[i]==ans[x])
					continue;
				else
				{
					NG[ans[i]].pb(ans[x]);
					cnt[ans[x]]++;		//in degree in new graph
				}
			}
		}
		int c=0;
		FOR(i,1,id)		
		{
			sort(same[i].begin(),same[i].end());
			if(tovisit1[i])
				c++;		//number of components which contain atleast 1 node to be visited
			v[i]=0;
		}
		FOR(i,1,id)		//checking if answer exists and toposort
			if(!v[i])
				dfs3(i);
		if(c1<c)
		{
			printf("-1\n");
			continue;
		}
		while(!topo.empty())
		{
			int x=topo.top();
		//	trace1(x);
			topo.pop();
			if(tovisit1[x])
			{
				tovisit1[x]=0;
				int l=same[x].size();
				REP(i,l)
				{
					int u=same[x][i];
					if(tovisit[u])
						printf("%d ",u);
				}
			}
		}
		printf("\n");
	}
	return 0;
}