/* Man Mohan Mishra aka m17
   IIIT - Allahabad */
#include <cstdio>
#include <cmath>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <utility>
#include <string>
#include <vector>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <set>
#include <iterator>

#define MOD 1000000007
#define INF 1000000000000000000
#define PI acos(-1)

using namespace std;

long long GCD (long long a,long long b) {
	if (b == 0) return a;
	return(a % b == 0 ? b : GCD(b,a % b));
}

long long POW (long long base,long long exp) {
	long long val;
	val = 1;
	while (exp > 0) {
		if (exp % 2 == 1) {
			val = (val * base) % MOD;
		}
		base = (base * base) % MOD;
		exp = exp / 2;
	}
	return val;
}

vector <int> in[100005];
vector <int> out[100005];
int marked[100005];
int ds[100005];
int vis[100005];
stack <int> st;
vector <int> adj[100005];
int useful[100005];
int dp[100005];
int par[100005];
int cur;
vector <int> necc[100005];

void dfs1 (int id) {
	int i,sz;
	vis[id] = 1;
	sz = out[id].size();
	for (i = 0; i < sz; i++) {
		if (vis[out[id][i]] == 0) {
			dfs1(out[id][i]);
		}
	}
	st.push(id);
}

void dfs2 (int id) {
	int i,sz;
	vis[id] = 1;
	ds[id] = cur;
	sz = in[id].size();
	for (i = 0; i < sz; i++) {
		if (vis[in[id][i]] == 0) {
			dfs2(in[id][i]);
		} else {
			if (ds[in[id][i]] != cur) {
				adj[ds[in[id][i]]].push_back(cur);
			}
		}
	}
}

int dfs3 (int id) {
	int i,sz,val;
	if (dp[id] != -1) return dp[id];
	dp[id] = 0;
	par[id] = -1;
	sz = adj[id].size();
	for (i = 0; i < sz; i++) {
		val = dfs3(adj[id][i]);
		if (val > dp[id]) {
			dp[id] = val;
			par[id] = adj[id][i];
		}
	}
	dp[id] = dp[id] + useful[id];
	return dp[id];
}

int main()
{
	int t;
	scanf("%d",&t);
	while (t --) {
		int n,m,k,x,y,i,j,sz,id,tot_useful;
		scanf("%d%d%d",&n,&m,&k);
		memset(marked,0,sizeof(marked));
		for (i = 0; i < k; i++) {
			scanf("%d",&x);
			marked[x] = 1;
		}
		for (i = 1; i <= n; i++) {
			in[i].clear();
			out[i].clear();
		}
		for (i = 0; i < m; i++) {
			scanf("%d%d",&x,&y);
			in[y].push_back(x);
			out[x].push_back(y);
		}
		memset(vis,0,sizeof(vis));
		for (i = 1; i <= n; i++) {
			if (vis[i] == 0) {
				dfs1(i);
			}
		}
		memset(vis,0,sizeof(vis));
		memset(ds,-1,sizeof(ds));
		cur = 0;
		while (!st.empty()) {
			id = st.top();
			st.pop();
			if (vis[id] == 1) continue;
			cur++;
			adj[cur].clear();
			dfs2(id);
		}
		memset(useful,0,sizeof(useful));
		for (i = 1; i <= cur; i++) {
			necc[i].clear();
		}
		for (i = 1; i <= n; i++) {
			if (marked[i] == 1) {
				useful[ds[i]] = 1;
				necc[ds[i]].push_back(i);
			}
		}
		for (i = 1; i <= cur; i++) {
			sort(necc[i].begin(),necc[i].end());
		}
		tot_useful = 0;
		for (i = 1; i <= cur; i++) {
			tot_useful = tot_useful + useful[i];
		}
		memset(dp,-1,sizeof(dp));
		for (i = 1; i <= cur; i++) {
			if (useful[i] == 1 && dp[i] == -1) {
				int temp = dfs3(i);
				if (dp[i] == tot_useful) {
					break;
				}
			}
		}
		if (dp[i] != tot_useful) {
			printf("-1\n");
			continue;
		}
		while (i != -1) {
			sz = necc[i].size();
			for (j = 0; j < sz; j++) {
				printf("%d ",necc[i][j]);
			}
			i = par[i];
		}
		printf("\n");
	}
	return 0;
}