#include <bits/stdc++.h>

using namespace std;

vector< vector<int>> res;
vector<int> adj[100001], cadj[100001];
int idx;
int tempo[100001], in_comp[100001], lowlink[100001];
stack<int> s;
int n, m, k;

vector<int> cities;
bool chas[100001], has[100001];
bool visited[100001];
int best[100001];

int scc(int i){
    lowlink[i] = tempo[i] = ++idx;
    s.push(i);
    
    for(int k : adj[i]){
        if(!tempo[k])
            lowlink[i] = min(lowlink[i], scc(k));
        else if(tempo[k] > 0) // on stack
            lowlink[i] = min(lowlink[i], lowlink[k]);
    }
    
    if(lowlink[i] == tempo[i]){
        vector<int> comp;
        int c = res.size();
        int k;
        do{
            k = s.top();
            s.pop();
            comp.push_back(k);
            in_comp[k] = c;
            tempo[k] = -1;
        }while(k != i);
        res.push_back(comp);
    }
    
    return lowlink[i];
}

void tarjan(){  
    idx = 0;
    s = stack<int>();
    res.clear();
    for(int i = 0; i < n; i++){
        if(!tempo[i]) scc(i);
    }
}

void contract(){
    memset(visited, 0, sizeof visited);
    for(int i = 0; i < res.size(); i++){
    	sort(res[i].begin(), res[i].end());
    	visited[i] = true;

        for(int u : res[i])
            for(int v : adj[u])
                if(!visited[in_comp[v]]) { cadj[i].push_back(in_comp[v]); visited[in_comp[v]] = true; }
                
        for(int u : res[i])
            for(int v : adj[u])
                 visited[in_comp[v]] = false;

        visited[i] = false;
        for(int u : res[i]) chas[i] |= has[u];
    }
}

int dfs(int u){
	visited[u] = true;

	for(int v : cadj[u]){
		if(chas[v]){
			best[u] = max(best[u], v);
			if(!visited[v]) dfs(v);
			best[u] = max(best[u], best[v]);
		}
		else if(visited[v]) best[u] = max(best[u], best[v]);
		else best[u] = max(best[u], dfs(v));
	}

	return best[u];
}

void init(){
	for(int i = 0; i < n; i++) adj[i].clear(), cadj[i].clear();
	memset(tempo, 0, sizeof tempo);
	memset(visited, 0, sizeof visited);
	memset(lowlink, 0, sizeof lowlink);
	cities.clear();
	memset(chas, 0, sizeof chas);
	memset(has, 0, sizeof has);
}

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

	for(int i = 0; i < k; i++){
		int x;
		scanf("%d", &x);
		--x;
		cities.push_back(x);
		has[x] = true;
	}

	for(int i = 0; i < m; i++){
		int u, v;
		scanf("%d%d", &u, &v);
		--u, --v;
		adj[u].push_back(v);
	}

	tarjan();
	contract();

	set<int, greater<int>> tmp;
	for(int u : cities) tmp.insert(in_comp[u]);

	vector<int> cc(tmp.begin(), tmp.end());

	memset(visited, 0, sizeof visited);
	memset(best, -1, sizeof best);
	for(int i = 0; i < res.size(); i++)
		if(!visited[i]) dfs(i);

	bool ok = true;
	for(int i = 1; i < cc.size(); i++){
		ok &= best[cc[i-1]] == cc[i];
	}

	if(!ok){
		puts("-1");
	}else{
		for(int i : cc){
			for(int j : res[i]){
				if(has[j]) printf("%d ", j+1);
			}
		}
		puts("");
	}
}

int main(){
	int T;
	scanf("%d", &T);

	while(T--){
		solve();
	}
}