#include <bits/stdc++.h>
using namespace std;

#define fru(j,n) for(int j=0; j<(n); ++j)
#define tr(it,v) for(auto it=(v).begin(); it!=(v).end(); ++it)
#define x first
#define y second
#define pb push_back
#define mp make_pair
#define ALL(G) (G).begin(),(G).end()

typedef long long ll;
typedef double D;
typedef pair<int,int> pii;
typedef vector<int> vi;

const int inft = 1000000009;
const int MAXN = 1000006;
namespace SCC{
	const int MAXN = 1000006; //USTAW, potem init !!
	int tin[MAXN],ct,n;
	vi V [MAXN],Q;
	int scc[MAXN],SCC;//out: 0<=scc[u]<SCC  - numer scc w ktorej jest u

	void przetworz(vi &R){ //zrob cos z ta SCC
		tr(it,R) scc[*it]=SCC;
		++SCC;
		//		printf("w scc o nr %d sa wierzcholki:\n",SCC);
		//		tr(it,R) printf("%d\n",*it);
	}

	int dfs(int u){
		tin[u]=ct++;
		Q.pb(u);
		int m=tin[u];
		tr(it,V[u]) if(scc[*it]==-1)  {
			if(tin[*it]!=-1) m=min(m,tin[*it]);
			else m=min(m,dfs(*it));
		}
		if(m==tin[u])  {
			vi R;
			do{
				R.pb(Q.back());
				Q.pop_back();
			}while(R.back()!=u);
			przetworz(R);
		}
		return m;
	}
	void init(int _n) //to na poczatku
	{
		n=_n;
		fru(i,n) V[i].clear();
		fru(i,n) scc[i]=tin[i]=-1;
		SCC=0;
		ct=0;
	}
	void krawedz(int a,int b){//0<=a,b<n
		V[a].push_back(b);
	}
	void go(){
		fru(i,n) if(tin[i]==-1) dfs(i);
	}
}
vector<pii> V[MAXN];
int prio[MAXN];
bool vis[MAXN];
int inorder[MAXN];
int order[MAXN],nr;
vector<int> S[MAXN];
int last[MAXN];
void solve() {
	int n,m,k;
	scanf("%d%d%d",&n,&m,&k);
	SCC::init(n);
	vi K(k);
	vector<pii> E(m);
	fru(i,k)scanf("%d",&K[i]);
	fru(i,k)K[i]--;
	fru(i,m){
		int a,b;
		scanf("%d%d",&a,&b);a--;b--;
		SCC::krawedz(a,b);
		E[i]=pii(a,b);
	}
	SCC::go();
	//mam scc, tworze graf i min_lex toposort
	int s=SCC::SCC;
	fru(i,s)V[i].clear();
	fru(i,s)prio[i]=MAXN+i;
	fru(i,k)prio[SCC::scc[K[i]]]=min(K[i],prio[SCC::scc[K[i]]]);
	fru(i,m){
		int u=SCC::scc[E[i].x],v=SCC::scc[E[i].y];
		if(u==v)continue;
		V[u].push_back(pii(prio[v],v));
	}
	fru(i,s)sort(ALL(V[i]));
	fru(i,s)V[i].resize(unique(ALL(V[i]))-V[i].begin());
/*	puts("SCC");
	fru(i,n)printf("%d ",SCC::scc[i]);puts("");
	printf("%d\n",s);
	fru(i,s){tr(it,V[i])printf("%d ",it->y);puts("");}
	fru(i,s)printf("%d ",prio[i]);puts("");
*/	//lex min
	fru(i,s)vis[i]=0;
	fru(i,s)tr(it,V[i])inorder[it->y]++;
	nr=0;
	fru(i,s)S[i].clear();
	fru(i,k)S[SCC::scc[K[i]]].pb(K[i]);
	fru(i,s)sort(ALL(S[i]));
	//lex sort
	fru(i,s)last[i]=0;
	int curr=0;
	priority_queue<pii> Q;
	fru(i,s)if(inorder[i]==0)Q.push(pii(-prio[i],i));
	bool ok=true;
	while(!Q.empty()){
		pii u=Q.top();Q.pop();
	//	printf("a%d, curr %d, last%d\n",u.y,curr,last[u.y]);
		tr(it,S[u.y])order[nr++]=*it;
		if(!S[u.y].empty()&& last[u.y]<curr)ok=false;
		if(!S[u.y].empty())last[u.y]=++curr;
		tr(it,V[u.y]){
			inorder[it->y]--;
			last[it->y]=max(last[it->y],last[u.y]);
		//	printf("zazn %d %d-> %d",it->y,last[it->y],last[u.y]);
			if(inorder[it->y]==0)Q.push(pii(-prio[it->y],it->y));
		}
	}
	if(!ok)printf("-1\n");else
	//check if ordering is good
	{fru(i,k)printf("%d ",order[i]+1);puts("");}
}

int main() {
	//	freopen("input.in", "r", stdin);
	//	freopen("output.out", "w", stdout);
	int t=1;
	scanf("%d",&t);
	fru(i,t) solve();
	return 0;
}