#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <cstring>
#include <map>
#include <cstdlib>
#define f first
#define s second
#define ll long long
#define ull unsigned long long
#define mp make_pair
#define pb push_back
#define vi vector <int>
#define pii pair<int, int>
using namespace std;          
const int N = int(4e5);
int T,n,m,k;
vi g[N],ans[N],order,gr[N],tps;
bool good[N];
int comp[N];
bool used[N];
int x[N],y[N];
int cnt;
bool ok[N][3];

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

}

void dfs2(int v){
	used[v] = 1;
	comp[v] = cnt;
	if(good[v]){
		ans[cnt].pb(v);
	}
	for(int i=0;i<gr[v].size();i++){
		if(!used[gr[v][i]]){
			dfs2(gr[v][i]);
		}
	}

}

void dfs(int v){
	used[v] = 1;
	for(int i=0;i<g[v].size();i++){
		if(!used[g[v][i]]){
			dfs(g[v][i]);
		}
	}
	tps.pb(v);
}

void dfss(int v,int u){
	ok[v][u] = 1;
	if(!u){
		for(int i=0;i<g[v].size();i++){
			int to = g[v][i];
			if(!ok[to][0]){
				dfss(to,0);
			}
		}
	}
	else{
		for(int i=0;i<gr[v].size();i++){
			int to = gr[v][i];
			if(!ok[to][1]){
				dfss(to,1);
			}
		}
	}
}


int main () {
	scanf("%d",&T);
	while(T--){
		scanf("%d%d%d",&n,&m,&k);
		for(int i=1,v;i<=k;i++){
			scanf("%d",&v);
			good[v] = 1;
		}
		for(int i=1,u,v;i<=m;i++){
			scanf("%d%d",&u,&v);
			g[u].pb(v);
			gr[v].pb(u);
			x[i] = u;
			y[i] = v;
		}
		bool yes = 1;
		for(int i=1;i<=n;i++) if(good[i]){
			dfss(i,0);
			dfss(i,1);
			for(int j=1;j<=n;j++){
				if(good[j] && !ok[j][0] && !ok[j][1]) yes = 0;
			}
			break;
		}

		if(!yes){
			puts("-1");
			for(int i=1;i<=n;i++){
			g[i].clear();
			good[i] = 0;
			gr[i].clear();
			ans[i].clear();
			used[i] = 0;
			ok[i][1] = ok[i][0] = 0;
		}
		order.clear();
		tps.clear();
			continue;
		}
		cnt = 0;
		for(int i=1;i<=n;i++) if(!used[i]) dfs1(i);
		memset(used,0,sizeof(used));
		for(int i=1;i<=n;i++){
			int v = order[n - i];
			if(!used[v]){
				cnt++;
				dfs2(v);
			}
		}
		for(int i=1;i<=n;i++) {
			g[i].clear();
		}
		for(int i=1;i<=m;i++){
			g[comp[x[i]]].pb(comp[y[i]]);
		}
		memset(used,0,sizeof(used));
		for(int i=1;i<=cnt;i++){
		    if(!used[i]) dfs(i);
		}
		reverse(tps.begin(),tps.end());
		for(int i=0;i<tps.size();i++){
			sort(ans[tps[i]].begin(),ans[tps[i]].end());
			for(int j=0;j<ans[tps[i]].size();j++){
				printf("%d ",ans[tps[i]][j]);
			}
		}
		puts("");
		for(int i=1;i<=n;i++){
			g[i].clear();
			good[i] = 0;
			gr[i].clear();
			ans[i].clear();
			used[i] = 0;
			ok[i][1] = ok[i][0] = 0;
		}
		order.clear();
		tps.clear();
	}

return 0;
}