#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;

typedef long long LL;
typedef pair <int, int> PII;
const int MAXN = 1e6 + 7, Mo = 1e9 + 7;

class Gabow{
public:
    static const int SIZE = 200005; 
    int cnt,idx[SIZE];
    int gao(int n, const vector<int> e[]){
        Pc=Qc=-1;
        for(int i=cnt=0;i<n;i++) idx[i]=tag[i]=-1;
        for(int i=use=0;i<n;i++) if(tag[i]<0) dfs(i,e);
        return cnt;
    }
private:
    int tag[SIZE],P[SIZE],Q[SIZE],use,Pc,Qc;
    void dfs(int x, const vector<int> e[]){
        tag[P[++Pc]=Q[++Qc]=x]=use++;
        for(size_t i=0;i<e[x].size();i++){
            int y=e[x][i];
            if(~idx[y]) continue;
            if(~tag[y]) while(tag[y]<tag[Q[Qc]]) Qc--;
            else dfs(y,e);
        }
        if(Q[Qc]==x) Qc--; else return;
        do idx[P[Pc]]=cnt; while(P[Pc--]!=x);
        cnt++;
    }
};

struct Node{
	vector <int> v;
	int id;
	
	Node(vector<int> a, int b): v(a), id(b) {}
	
	bool operator < (const Node &a) const{	// notice!
		/*int n = min(v.size(), a.v.size());
		for (int i=0; i<n; i++){
			if (v[i] > a.v[i]) return true;
			if (v[i] < a.v[i]) return false;
		}
		return true;*/
		return v > a.v;
	}
};

int N, M, K;
int tar[MAXN];
vector <int> E[MAXN];

void init(){
	scanf("%d%d%d", &N, &M, &K);
	for (int i=0; i<N; i++){
		tar[i] = 0;	E[i].clear();
	}
	for (int i=0; i<K; i++){
		int x; scanf("%d", &x); x--;
		tar[x] = 1;
	}
	for (int i=0; i<M; i++){
		int x, y; scanf("%d%d", &x, &y); x--; y--;
		E[x].push_back(y);
	}
}

vector <int> edge[MAXN], mem[MAXN];
set <int> nxt[MAXN];	
int deg[MAXN] = {};	// input degree
Gabow G;

void work(){
	int cnt = G.gao(N, E);	
	for (int i=0; i<cnt; i++){
		edge[i].clear(); mem[i].clear(); nxt[i].clear(); 
		deg[i] = 0;
	}
	
	for (int i=0; i<N; i++){
		int u = G.idx[i];
		if (tar[i]) mem[u].push_back(i);
		for (auto &x : E[i]){
			int v = G.idx[x];
			if (u == v) continue;
			if (nxt[u].count(v) == 0){
				nxt[u].insert(v);
				edge[u].push_back(v);
				deg[v]++;
			}
		}
	}
	
	int sum = 0;
	
	priority_queue <Node> Q;
	for (int i=0; i<cnt; i++) 
		if (deg[i] == 0){
			Q.push(Node(mem[i], i));
			if (mem[i].size() > 0) sum++;
		}
	bool noans = sum > 1;

	vector <int> ans;
	while (!Q.empty()){
		if (Q.top().v.size() > 0) sum--;
		
		for (auto &x : Q.top().v) ans.push_back(x);
		int now = Q.top().id;
		Q.pop();
		
		for (auto &x : edge[now]){
			deg[x]--;
			if (deg[x] == 0){
				Q.push(Node(mem[x], x));
				if (mem[x].size() > 0) sum++;
			}
		}
		if (sum > 1) noans = true;
	}
	
	if (noans || ans.size() != K){ puts("-1"); return; }
	
	for (int i=0; i<ans.size(); i++){
		printf("%d%c", ans[i]+1, (i+1<ans.size())?' ':'\n');
	}
}

int main(){	
	int t; scanf("%d", &t);
	while (t--){
		init();		
		work();
	}
	return 0;
}