/*
*/

//#pragma comment(linker, "/STACK:16777216")
#include <fstream>
#include <iostream>
#include <string>
#include <complex>
#include <math.h>
#include <set>
#include <vector>
#include <map>  
#include <queue>
#include <stdio.h>
#include <stack>
#include <algorithm>
#include <list>
#include <ctime>
#include <memory.h>
#include <ctime> 
#include <assert.h>

#define y0 sdkfaslhagaklsldk
#define y1 aasdfasdfasdf
#define yn askfhwqriuperikldjk
#define j1 assdgsdgasghsf
#define tm sdfjahlfasfh
#define lr asgasgash

#define eps 1e-6
#define M_PI 3.141592653589793
#define bs 1000000007
#define bsize 512

using namespace std;

int tests,n,m,k;

vector<int> need;
vector<int> g[1<<20],gr[1<<20];
vector<int> order;
int used[1<<20];
int comps;

void dfs1(int v)
{
	used[v]=1;
	for (int i=0;i<g[v].size();i++)
	{
		int to=g[v][i];
		if (used[to])
			continue;
		dfs1(to);
	}
	order.push_back(v);
}

void dfs2(int v)
{
	used[v]=comps;
	for (int i=0;i<gr[v].size();i++)
	{
		int to=gr[v][i];
		if (used[to])
			continue;
		dfs2(to);
	}
}

set<pair<int, int> > edges;

int dp[1<<20];
vector<int> G[1<<20];
int totake[1<<20];
vector<int> gg[1<<20];
int cost[1<<20];
vector<int> ans;

int main(){
//freopen("beavers.in","r",stdin);
//freopen("beavers.out","w",stdout);
//freopen("F:/in.txt","r",stdin);
//freopen("F:/output.txt","w",stdout);
ios_base::sync_with_stdio(0);
//cin.tie(0);

cin>>tests;
for (;tests;--tests)
{
	cin>>n>>m>>k;
	need.clear();
	for (int i=1;i<=k;i++)
	{
		int val;
		cin>>val;
		need.push_back(val);
	}
	for (int i=1;i<=n;i++)
		g[i].clear(),
		gr[i].clear();
	
	for (int i=1;i<=m;i++)
	{
		int a,b;
		cin>>a>>b;
		g[a].push_back(b);
		gr[b].push_back(a);
	}
	
	order.clear();
	for (int i=1;i<=n;i++)
		used[i]=0;
	
	for (int i=1;i<=n;i++)
	{
		if (used[i])
			continue;
		dfs1(i);
	}
	for (int i=1;i<=n;i++)
		used[i]=0;
	reverse(order.begin(),order.end());
	
	comps=0;
	
	for (int i=0;i<order.size();i++)
	{
		int v=order[i];
		if (used[v])
			continue;
		++comps;
		dfs2(v);
	}
	
	edges.clear();
	for (int i=1;i<=n;i++)
		dp[i]=0,
		G[i].clear(),
		gg[i].clear();
		
	for (int i=1;i<=n;i++)
	{
		int v1=i;
		for (int j=0;j<g[i].size();j++)
		{
			int to=g[i][j];
			if (used[v1]==used[to])
				continue;
			pair<int, int> tp=make_pair(used[v1],used[to]);
			if (edges.find(tp)!=edges.end())
				continue;
			edges.insert(tp);
			G[tp.first].push_back(tp.second);
		}
	}
	/*
	for (int i=1;i<=comps;i++)
	{
		cout<<i<<": ";
		for (int j=0;j<G[i].size();j++)
			cout<<G[i][j]<<" ";
		cout<<endl;
	}
	
	for (int i=1;i<=n;i++)	
		cout<<used[i]<<" ";
	cout<<endl;
	*/
	for (int i=1;i<=n;i++)
		cost[i]=0;
	
	for (int i=0;i<need.size();i++)
	{
		int v=used[need[i]];
		cost[v]++;
		gg[v].push_back(need[i]);
	}
	
	for (int i=1;i<=comps;i++)
	{
		sort(gg[i].begin(),gg[i].end());
		dp[i]+=cost[i];
		for (int j=0;j<G[i].size();j++)
		{
			int to=G[i][j];
			dp[to]=max(dp[to],dp[i]);
		}
	}
	
	int found=-1;
	for (int i=1;i<=comps;i++)
	{
		if (dp[i]==need.size())
			found=1;
	}
	
	if (found==-1)
	{
		cout<<-1<<endl;
		continue;
	}
	
	ans.clear();
	for (int i=1;i<=n;i++)
		totake[i]=0;
	for (int i=0;i<need.size();i++)
		totake[need[i]]=1;
	
	for (int i=1;i<=comps;i++)
		for (int j=0;j<gg[i].size();j++)
			if (totake[gg[i][j]])
				ans.push_back(gg[i][j]);
	
	for (int i=0;i<ans.size();i++)
	{
		if (i)
			cout<<" ";
		cout<<ans[i];
	}
	cout<<endl;
}

//cin.get();cin.get();
return 0;}