#include <iostream>
#include <fstream>
#include <cstdio>
#include <math.h>
#include <vector>
#include <string.h>
#include <algorithm>
#include <climits>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define MAX(a,b) a>b?a:b
#define MIN(a,b) a>b?b:a
#define FOR(i,n) for(i=0;i<n;i++)
#define FOR_X(i,x,n) for(i=x;i<n;i++)
#define BACK(i,n) for(i=n;i>=0;i--)
#define BACK_X(i,n,x) for(i=n;i>=x;i--)
#define fill(a,v) memset(a,v,sizeof(a))
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/gcd(a,b)
#define pb push_back
#define pp pair<int,int>
typedef long long int lld;
using namespace std;
const int N=100005;
vector<int> graph[N],trans[N],newgraph[N],nodes[N];
int ele[N],vis[N],indeg[N],hasval[N],lvl[N];
stack<int> st;
map<pp,int> m1;
queue<int> q1,q2;
void refresh(){
	fill(ele,0);
	fill(indeg,0);
	fill(hasval,0);
	fill(lvl,0);
	while(!st.empty())
		st.pop();
	m1.clear();
	while(!q1.empty())
		q1.pop();
	while(!q2.empty())
		q2.pop();
	int i;
	FOR(i,N)
	{
		graph[i].clear(); trans[i].clear(); newgraph[i].clear(); nodes[i].clear();
	}
}
void dfs(int x){
	vis[x]=1;
	int i,size=graph[x].size();
	FOR(i,size){
		if( vis[ graph[x][i] ]== 0 ){
			dfs( graph[x][i] );
		}
	}
	st.push(x);
}
void dfs2(int x,int comp){
	vis[x]=comp;
//	cout<<x<<" : "<<comp<<endl;
	nodes[comp].pb(x);
	if(ele[x])
	{
		hasval[comp]=1;
	}
	int i,size=trans[x].size();
	FOR(i,size){
		if( vis[ trans[x][i] ]==0 ){
			dfs2(trans[x][i],comp);
		}
	}
}
int main()
{
	//ios_base::sync_with_stdio(0); //dont use with EOF
	int t,n,m,k,i;
	cin>>t;
	while(t--){
		refresh();
		cin>>n>>m>>k;
		FOR(i,k){
			int tmp;
			cin>>tmp;
			tmp--;
			ele[tmp]=1;
		}
		FOR(i,m){
			int u,v;
			cin>>u>>v;
			u--; v--;
			graph[u].pb(v);
			trans[v].pb(u);
		}
		fill(vis,0);
		FOR(i,n){
			if(vis[i]==0){
				dfs(i);
			}
		}
		fill(vis,0);
		int comp=0;
		while( !st.empty() ){
			int tmp= st.top();
			st.pop();
		//	cout<<"stack: "<<tmp<<endl;
			if( vis[tmp]==0){
				comp++;
				dfs2(tmp,comp);
			}
		}
	//	cout<<"done SCC\n";
	//	FOR(i,n)cout<<i<<" : "<<vis[i]<<endl;
		for(i=0;i<n;i++)
		{
			int si=graph[i].size();
			for(int j=0;j<si;j++)
			{
				int v=graph[i][j];
				if(vis[i]!=vis[v])
				{
					if(m1[pp(vis[i],vis[v])]==0)
					{
						newgraph[vis[i]].pb(vis[v]);
						m1[pp(vis[i],vis[v])]=1;
						indeg[vis[v]]++;
					}
				}
			}
		}
		int var=0,flag=0;
		for(i=1;i<comp;i++)
		{
			if(indeg[i]==0)
			{
				//q.push(i);
				if(hasval[i]){
					var++;
					q2.push(i);
				}
				else
				{
					q1.push(i);
				}
			}
		}
		vector<int> ans;
		while(!q1.empty() || !q2.empty())
		{
			if(var>1)
			{
				flag=1;
				break;
			}
			if(!q1.empty())
			{
				int u=q1.front();
				q1.pop();
				int si=newgraph[u].size();
				for(int j=0;j<si;j++)
				{
					int v=newgraph[u][j];
					indeg[v]--;
					if(indeg[v]==0)
					{
						if(hasval[v])
						{
							var++;
							q2.push(v);
						}
						else
						{
							q1.push(v);
						}
					}
				}
			}
			else
			{
				int u=q2.front();
				q2.pop();
				ans.push_back(u);
				var--;
				int si=newgraph[u].size();
				for(int j=0;j<si;j++)
				{
					int v=newgraph[u][j];
					indeg[v]--;
					if(indeg[v]==0)
					{
						if(hasval[v])
						{
							var++;
							q2.push(v);
						}
						else
						{
							q1.push(v);
						}
					}
				}
			}

		}
	//	cout<<"done cal\n";
		if(flag)
		{
			printf("-1\n");
			continue;
		}
		int si=ans.size();
		for(i=0;i<si;i++)
		{
			int u=ans[i];
			int si2=nodes[u].size();
			sort(nodes[u].begin(),nodes[u].end());
			for(int j=0;j<si2;j++)
			{
				if(ele[nodes[u][j]])
					printf("%d ",nodes[u][j]+1);
			}
		}
		printf("\n");
	}
	return 0;
}