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


bool toVis[100010];
int scc[100010];
bool vis[100010];

void dfs1(int curr,vector< vector<int> >& adjList, stack<int>& s){
	vis[curr] = true;
	for(int i=0;i<adjList[curr].size();i++){
		int nxt = adjList[curr][i];
		if(vis[nxt]) continue;
		dfs1(nxt,adjList,s);
	}
	s.push(curr);
}

void dfs2(int curr,vector< vector<int> >& adjList,int currScc){
	vis[curr] = true;
	scc[curr] = currScc;
	for(int i=0;i<adjList[curr].size();i++){
		int nxt = adjList[curr][i];
		if(vis[nxt]) continue;
		dfs2(nxt,adjList,currScc);
	}
}


int build(int N, vector< vector<int> >& adjList, vector< vector<int> >& revG){
	for(int i=0;i<N;i++) vis[i] = false;
	stack<int> s;
	for(int i=0;i<N;i++){
		if(vis[i] == false){
			dfs1(i,adjList,s);
		}
	}
	for(int i=0;i<N;i++) vis[i] = false;
	int currScc = 0;
	while(!s.empty()){
		if(!vis[s.top()]){
			dfs2(s.top(),revG,currScc);
			currScc += 1;
		}
		s.pop();
	}
	return currScc;
}

void buildSCCG(int curr, vector< vector<int> >& adjList, vector< set<int> >& sccG){
	int cs = scc[curr];
	vis[curr] = true;
	for(int i=0;i<adjList[curr].size();i++){
		int here = adjList[curr][i];
		if(cs != scc[here])sccG[cs].insert(scc[here]);
		if(vis[here]) continue;
		buildSCCG(here,adjList,sccG);
	}
}

bool visScc[100010];
int mxSc[100010];
int dfsFin(int curr, vector< set<int> > & adjList){
	vis[curr] = true;
	int maxSc = 0;
	for(set<int>::iterator it = adjList[curr].begin();it!=adjList[curr].end();it++){
		int here = (*it);
		if(vis[here]){
			//cout<<curr+1<<" "<<maxSc<<" "<<here+1<<" "<<mxSc[here]<<endl;
			maxSc = max(maxSc,mxSc[here]);
			continue;
		}
		maxSc = max(maxSc,dfsFin(here,adjList));
	}
	return mxSc[curr] = maxSc+(visScc[curr]?1:0);
}

int ans[100010];

void getAns(int curr, vector< set<int> >& adjList, vector< vector<int> >& parts,int idx,int rem){
	if(visScc[curr] == true){
		for(int i=0;i<parts[curr].size();i++){
			if(toVis[parts[curr][i]]){
//				cout<<idx<<" "<<parts[curr][i]+1<<endl;
				ans[idx++] = parts[curr][i];
			}
		}
		rem -= 1;
	}
	for(set<int>::iterator it = adjList[curr].begin();it!=adjList[curr].end();it++){
		int here = (*it);
		if(mxSc[here] == rem){
			getAns(here,adjList,parts,idx,rem);
			break;
		}
	}
}
int main(){
	int cases;cin>>cases;
	for(int n=0;n<cases;n++){
		int N,M,K;cin>>N>>M>>K;
		vector<int> touch(K);
		for(int i=0;i<N;i++){
			visScc[i] = false;
			toVis[i] = false;
			mxSc[i] = 0;
			//maxScVis[i] = 0;
		}
		for(int i=0;i<K;i++){
			int x;cin>>x;x--;
			toVis[x] = true;
			touch[i] = x;
		}
		vector< vector<int> > adjList(N);
		vector< vector<int> > revG(N);
		for(int i=0;i<M;i++){
			int x,y;cin>>x>>y;x--;y--;
			adjList[x].push_back(y);
			revG[y].push_back(x);
		}
		int totalSc = build(N,adjList,revG);
		//for(int i=0;i<N;i++) cout<<scc[i]<<" ";
		//cout<<endl;
		int scCnt =0 ;
		for(int i=0;i<touch.size();i++){
			if(visScc[scc[touch[i]]] == false){
				scCnt += 1;
				visScc[scc[touch[i]]] = true;
			}
		}
		vector< set<int> > sccG(totalSc);
		vector< vector<int> > parts(totalSc);
		for(int i=0;i<N;i++) parts[scc[i]].push_back(i);
		for(int i=0;i<parts.size();i++) sort(parts[i].begin(),parts[i].end());
		for(int i=0;i<N;i++) vis[i] = false;
		for(int i=0;i<N;i++){
			if(!vis[i]){
				buildSCCG(i,adjList,sccG);
			}
		}
		// Number of scc's that we need to visit
		//cout<<scCnt<<endl;
		for(int i=0;i<N;i++) vis[i] = false;
		for(int i=0;i<totalSc;i++){
			if(!vis[i])dfsFin(i,sccG);
		}
		//for(int i=0;i<totalSc;i++) cout<<mxSc[i]<<" ";
		//cout<<endl;
		bool p = false;
		for(int i=0;i<totalSc;i++){
			if(mxSc[i] == scCnt){
				p = true;
				getAns(i,sccG,parts,0,scCnt);
				break;
			}
		}
		if(!p) cout<<-1<<endl;
		else{
			for(int i=0;i<K;i++) cout<<ans[i]+1<<" ";
			cout<<endl;
		}
	}
	return 0;
}