#include "bits/stdc++.h"

using namespace std;

const int MAXN = 100005;

int T;
int n, m, k;
vector<int> g[MAXN];
int cnt;
vector<int> comp[MAXN];
vector<int> g2[MAXN], g1[MAXN];
int nm[MAXN];
char need[MAXN];
char was[MAXN];
int mark[MAXN];
vector<int> order;
int in[MAXN];
int nxt[MAXN];
int R[MAXN];
bool error;

void dfs1 (int v) {
	was[v] = 1;

	for (int i = 0 ;i < (int) g[v].size (); i++) {
		if (!was[g[v][i]]) {
			dfs1 (g[v][i]);			
		}
	}
	order.push_back (v);
}

void dfs2 (int v) {
	nm[v] = cnt;
	comp[cnt].push_back (v);

	was[v] = 1;

	for (int i = 0; i < (int) g1[v].size (); i++) {
		if (!was[g1[v][i]])
			dfs2 (g1[v][i]);
	}
}

void build () {
	for (int i = 1; i <= cnt; i++) {
		sort (comp[i].begin (), comp[i].end ());
		int N = 0;
		for (int j = 0; j < (int) comp[i].size (); j++) {
			N += (need[comp[i][j]]);
			for (int k = 0; k < (int) g[comp[i][j]].size (); k++) {
				if (nm[g[comp[i][j]][k]] != i) {
					g2[i].push_back (nm[g[comp[i][j]][k]]);
					in[nm[g[comp[i][j]][k]]]++;
				}
			}
		}
		mark[i] = N;
	}
}

void read () {
	scanf ("%d %d %d", &n, &m, &k);

	for (int i = 0, a; i < k; i++) {
		scanf ("%d", &a);
		need[a] = 1;
	}

	for (int i = 0, a, b; i < m; i++) {
		scanf ("%d %d", &a, &b);
		g[a].push_back (b);
		g1[b].push_back (a);
	}
}

int get_path (int v) {
	if (was[v])
		return R[v];
	was[v] = 1;
	R[v] = 0;
	for (int i = 0; i < (int) g2[v].size (); i++) {
		int t = get_path (g2[v][i]);
		if (t > R[v]) {
			R[v] = t;
			nxt[v] = g2[v][i];
		}
	}
	return R[v] += mark[v];
}

void solve () {
	memset (was, 0, sizeof (was) );
	order.clear ();
	for (int i = 1; i <= n; i++) {
		if (was[i] == 0) {
			dfs1 (i);
		}
	}
	reverse (order.begin (), order.end ());	
	memset (was, 0, sizeof (was) );
	for (int i = 0; i < (int) order.size (); i++) {
		if (was[order[i]])
			continue;
		cnt++;
		dfs2 (order[i]);
	}

	build ();

	for (int i = 1; i <= cnt; i++) {
		if (!in[i])
			g2[0].push_back (i);
	}

	memset (nxt, 0xff, sizeof (nxt));
	memset (was, 0, sizeof (was));
	int ln = get_path (0);
	if (ln != k) {
		printf ("-1\n");
		return;
	}

	int cur = 0;

	while (cur != -1) {
		for (int i = 0; i < (int) comp[cur].size (); i++) {
			if (need[comp[cur][i]])
				printf ("%d ", comp[cur][i]);
		}
		cur = nxt[cur];
	}
	puts ("");
}

void clear () {
	for (int i = 1; i <= n; i++) {
		g[i].clear ();
		g1[i].clear ();
	}
	for (int i = 0; i <= cnt; i++) {
		g2[i].clear ();
	}
	for (int i = 1; i <= n; i++) {
		need[i] = 0;
	}
	for (int i = 1; i <= cnt; i++) {
		comp[i].clear ();
	}
	for (int i = 1; i <= cnt; i++) {
		in[i] = 0;
	}
	cnt = 0;
	error = false;
}

int main () {

	scanf ("%d", &T);

	while (T --> 0) {
		read ();
		solve ();
		clear ();
	}

	return 0;
}