//Mobius_Treap
#include<bits/stdc++.h>

using namespace std;

typedef pair<int,int>   II;
typedef vector< II >      VII;
typedef vector<int>     VI;
typedef vector< VI > 	VVI;
typedef long long int 	LL;

#define PB push_back
#define MP make_pair
#define F first
#define S second
#define SZ(a) (int)(a.size())
#define ALL(a) a.begin(),a.end()
#define SET(a,b) memset(a,b,sizeof(a))

#define si(n) scanf("%d",&n)
#define dout(n) printf("%d\n",n)
#define sll(n) scanf("%lld",&n)
#define lldout(n) printf("%lld\n",n)
#define fast_io ios_base::sync_with_stdio(false);cin.tie(NULL)

//#define TRACE

#ifdef TRACE
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void __f(const char* name, Arg1&& arg1){
	cerr << name << " : " << arg1 << std::endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args){
	const char* comma = strchr(names + 1, ',');cerr.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
}
#else
#define trace(...)
#endif

//FILE *fin = freopen("in","r",stdin);
//FILE *fout = freopen("out","w",stdout);
const int N = int(2e5)+10;
VI g[N];
VI rg[N],order,togo[N];
VI dag[N];
int indeg[N];
int nn,comp[N];
bool go[N];
int vis[N];
void reset(int n,int m)
{
	for(int i=0;i<N;i++)
	{
		g[i].clear(),rg[i].clear(),togo[i].clear(),dag[i].clear();
		comp[i]=0;
		vis[i]=0;
		go[i]=false;
		indeg[i]=0;
	}
	nn=0;
	order.clear();
}
void dfs1(int u)
{
	vis[u]=1;
	for(int i=0;i<SZ(g[u]);i++)
		if(!vis[g[u][i]])
			dfs1(g[u][i]);
	order.PB(u);
}
void dfs2(int u)
{
	vis[u]=1;
	comp[u]=nn;
	if(go[u])togo[nn].PB(u);
	for(int i=0;i<SZ(rg[u]);i++)
		if(!vis[rg[u][i]])
			dfs2(rg[u][i]);
}
void dfs(int u)
{
	vis[u]=1;
	for(int i=0;i<SZ(dag[u]);i++)
		if(!vis[dag[u][i]])
			dfs(dag[u][i]);
}
int main()
{
	int t;si(t);
	while(t--)
	{
		int n,m,k;
		si(n);si(m);si(k);
		for(int i=0;i<k;i++)
		{
			int x;si(x);
			go[x]=true;
		}
		for(int i=0;i<m;i++)
		{
			int u,v;
			si(u);si(v);
			g[u].PB(v);
			rg[v].PB(u);
		}
		//build dag
		for(int i=1;i<=n;i++)
			if(!vis[i])
				dfs1(i);
		SET(vis,0);
		nn=0;
		for(int i=1;i<=n;i++)
		{
			int v = order[n-i];
			if(!vis[v])
			{
				dfs2(v);
				nn++;
			}
		}
		for(int i=1;i<=n;i++)
			for(int j=0;j<SZ(g[i]);j++)
				if(comp[i]!=comp[g[i][j]])
				{
					dag[comp[i]].PB(comp[g[i][j]]);
					indeg[comp[g[i][j]]]++;
				}
		//dag done :)
		queue<int> Q[2];
		int curr=0,nxt=1;
		for(int i=0;i<nn;i++)
			if(indeg[i]==0)
				Q[curr].push(i);
		int s = -1;
		int cnt=0;
		VI ans;
		ans.clear();
		while(!Q[curr].empty())
		{
			int u = Q[curr].front();
			Q[curr].pop();
			if(SZ(togo[u])>0)
			{
				s = u;
				sort(ALL(togo[u]));
				ans.insert(ans.end(),ALL(togo[u]));
				cnt++;
			}
			for(int i=0;i<SZ(dag[u]);i++)
			{
				indeg[dag[u][i]]--;
				if(!indeg[dag[u][i]])
					Q[nxt].push(dag[u][i]);
			}
			if(SZ(Q[curr])==0)
			{
				swap(curr,nxt);
				if(cnt>0)
					break;
			}
		}
		if(cnt>1)
		{
			dout(-1);
			reset(n,m);
			while(!Q[1].empty())Q[1].pop();
			while(!Q[0].empty())Q[0].pop();
			continue;
		}
		//ok
		SET(vis,0);
		dfs(s);
		bool ok=true;
		cnt=0;
		while(!Q[curr].empty())
		{
			int u = Q[curr].front();
			Q[curr].pop();
			trace(u,vis[u],SZ(togo[u]));
			if(!vis[u] && SZ(togo[u])>0)
			{
				ok = false;
				break;
			}
			if(vis[u] && SZ(togo[u])>0)
			{
				cnt++;
				if(cnt>1)
				{
					ok = false;
					break;
				}
				else
				{
					sort(ALL(togo[u]));
					ans.insert(ans.end(),ALL(togo[u]));
				}
			}
			for(int i=0;i<SZ(dag[u]);i++)
			{
				indeg[dag[u][i]]--;
				if(!indeg[dag[u][i]])
					Q[nxt].push(dag[u][i]);
			}
			if(SZ(Q[curr])==0)
			{
				swap(curr,nxt);
				cnt=0;
			}
		}
		if(!ok)dout(-1);
		else for(int i=0;i<SZ(ans);i++)printf("%d%s",ans[i],i==SZ(ans)-1?"\n":" ");
		reset(n,m);
		while(!Q[1].empty())Q[1].pop();
		while(!Q[0].empty())Q[0].pop();
	}
	return 0;
}