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

#define rep(i, from, to) for (int i = from; i < int(to); ++i)
#define trav(a, x) for (auto& a : x)
#define all(x) x.begin(), x.end()
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;

vector<int> val, num, comp;
int no_vertices, no_components;
stack<int> z;
template<class G> void dfs(int j, G &g) {
	num[j] = val[j] = no_vertices++; comp[j] = 0; z.push(j);
	trav(e,g[j])
		if (comp[e] == -1) {
			dfs(e, g);
			num[j] = min(num[j], num[e]);
		}
		else if (comp[e] == 0)
			num[j] = min(num[j], val[e]);

	if (val[j] == num[j]) {
		no_components++;
		while (true) {
			comp[z.top()] = no_components;
			if (z.top() == j) { z.pop(); break; }
			z.pop();
		}
	}
}
template<class G> vector<int> go(G &g) {
	int n = sz(g);
	val.assign(n, 0); num = val;
	no_vertices = no_components = 0;
	comp.assign(n, -1);
	rep(i,0,n) if (comp[i] == -1) dfs(i, g);
	rep(i,0,n) comp[i]--;
	return comp;
}

template <class E, class I>
bool topo_sort(const E& edges, vi& prio, I &order, int n) {
	vector<int> indeg(n);
	rep(i,0,n)
		trav(e, edges[i])
			indeg[e]++;
	struct Cmp {
		vi& prio;
		Cmp(vi& prio) : prio(prio) {}
		bool operator()(int a, int b) {
			return prio[a] > prio[b];
		}
	};
	Cmp cmp(prio);
	priority_queue<int, vi, Cmp> q(cmp);
	rep(i,0,n) if (indeg[i] == 0) q.push(i); // , cerr << "init add " << i << endl;
	int nr = 0;
	while (q.size() > 0) {
		int i = q.top();
		order[nr++] = i;
		q.pop();
// cerr << "set " << i << endl;
		if (!q.empty() && prio[i] != -1)
			return false;
		trav(e, edges[i])
			if (--indeg[e] == 0) q.push(e); // , cerr << "then add " << e << endl;
	}
	assert(nr == n);
	return true;
}

void solve() {
	int N, M, K;
	cin >> N >> M >> K;
	vi qs(K);
	rep(i,0,K) cin >> qs[i], --qs[i];
	vector<vi> g(N);
	rep(i,0,M) {
		int a, b;
		cin >> a >> b;
		--a, --b;
		g[a].push_back(b);
	}
	vi comp = go(g);
	int ncomps = no_components;
	vi prio(ncomps, N);
	trav(q, qs) {
		prio[comp[q]] = min(prio[comp[q]], q);
	}
	rep(i,0,ncomps) if (prio[i] == N) prio[i] = -1;
	vector<vi> ed2(ncomps);
	rep(i,0,N) {
		trav(j, g[i]) {
			if (comp[i] != comp[j])
				ed2[comp[i]].push_back(comp[j]);
		}
	}

// cout << "comp: "; rep(i,0,N) cout << comp[i] << ' '; cout << endl;
// cout << "prio: "; rep(i,0,ncomps) cout << prio[i] << ' '; cout << endl;
// rep(i,0,ncomps) { cout << i << ": "; trav(j, ed2[i]) cout << j << ' '; cout << endl; }

	vi out(ncomps);
	if (!topo_sort(ed2, prio, out, ncomps)) {
		cout << -1 << endl;
	}
	else {
// cout << "order:"; rep(oi,0,ncomps) cout << ' ' << out[oi]; cout << endl;
		vector<vi> compconts(ncomps);
		trav(q, qs) compconts[comp[q]].push_back(q);
		rep(oi,0,ncomps) {
			int i = out[oi];
			vi& conts = compconts[i];
			sort(all(conts));
			trav(c, conts) cout << c+1 << ' ';
		}
		cout << endl;
	}
}

int main() {
	cin.sync_with_stdio(false);
	int N;
	cin >> N;
	rep(i,0,N) solve();
}