#include <cstdio>
#include <vector>
#include <string.h>
#include <algorithm>
#include <vector>
#include <bitset>
using namespace std;

#define N 410000

int n, m, a, b, L, Time, len, j, k, till[N], to[N], dfn[N], low[N], go[N], Next[N], zhan[N * 2], ans[N], n1[N], ord[N], de[N];
bool in[N], used[N];
vector <int> ve[N];

bool cmp(int x, int y) {
	if (to[x] == to[y])
		return x < y;
	else
		return ord[to[x]] < ord[to[y]];
}

void add(int x, int y) {
	Next[++len] = till[x];
	till[x] = len;
	go[len] = y;
}

void xiao(int k) {
	zhan[zhan[0] + 1] = 0;
	L++;
	while (zhan[zhan[0] + 1] != k) {
		to[zhan[zhan[0]]] = L;
		in[zhan[zhan[0]]] = false;
		zhan[0]--;
	}
}

void tarjan(int k) {
	dfn[k] = low[k] = ++Time;
	in[k] = true; zhan[++zhan[0]] = k;
	for (int i = till[k]; i; i = Next[i])
		if (!dfn[go[i]])	tarjan(go[i]), low[k] = min(low[k], low[go[i]]);
		else	if (in[go[i]])	low[k] = min(low[k], dfn[go[i]]);
	if (low[k] == dfn[k])	xiao(k);
}

bool can(int x, int y) {
	int q, h;
	
	n1[q = h = 1] = x;
	used[x] = true;
	for (q = 1; q <= h; q++) {
		for (int i = 0; i < (int) ve[n1[q]].size(); i++) {
			int k = ve[n1[q]][i];
			if (!used[k] && ord[x] <= ord[k] && ord[k] <= ord[y])
				used[n1[++h] = k] = true;
		}
	}
	bool tt = used[y];
	for (int i = 1; i <= h; i++)
		used[n1[i]] = false;
	return tt;
}

int main() {
	int T;
	scanf("%d", &T);
	while (T--) {
		memset(low, 0, sizeof low);
		memset(dfn, 0, sizeof dfn);
		memset(till, 0, sizeof till);
		memset(in, false, sizeof in);
		memset(zhan, 0, sizeof zhan);
		
		len = L = Time = 0;
		
		scanf("%d%d%d", &n, &m, &k);
		for (int i = 1; i <= k; i++)
			scanf("%d", &ans[i]);
		for (int i = 1; i <= m; i++) {
			scanf("%d%d", &a, &b);
			add(a, b);
		}
		for (int i = 1; i <= n; i++)
			if (!dfn[i]) tarjan(i);
		
		for (int i = 1; i <= L; i++)
			de[i] = 0, ve[i].clear();

		for (int i = 1; i <= n; i++)
			for (int j = till[i]; j; j = Next[j])
				if (to[i] != to[go[j]])
					ve[to[i]].push_back(to[go[j]]), de[to[go[j]]]++;
		int q, h = 0;
		for (int i = 1; i <= L; i++)
			if (!de[i]) n1[++h] = i, ord[i] = h;
		for (q = 1; q <= h; q++)
			for (int i = 0; i < (int) ve[n1[q]].size(); i++) {
				--de[ve[n1[q]][i]];
				if (!de[ve[n1[q]][i]]) {
					h++;
					n1[h] = ve[n1[q]][i];
					ord[ve[n1[q]][i]] = h;
				}
			}
		sort(ans + 1, ans + k + 1, cmp);
		
		bool ok = true;
		for (int i = 1; i < k; i++)
			if (to[ans[i]] != to[ans[i + 1]] && !can(to[ans[i]], to[ans[i + 1]]))
				ok = false;
		
		if (!ok) printf("-1\n");
		else {
			for (int i = 1; i <= k; i++) {
				printf("%d", ans[i]);
				if (i < k) printf(" ");
				else printf("\n");
			}
		}
	}
}