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

const int N = 200010;
int n, m, isDeliveryZone[N], k, inDeg[N], topOrder[N], marks[N], seen[N];
vector<int> G[N], g[N];
vector<int> deliveryZones, topVec;
vector<int> ans[N];

struct edge{int e, nxt;};
int V, E;
edge e[N], er[N];
int sp[N], spr[N];
int group_cnt, group_num[N];
bool v[N];
int stk[N];
void fill_forward(int x)
{
  int i;
  v[x]=true;
  for(i=sp[x];i;i=e[i].nxt) if(!v[e[i].e]) fill_forward(e[i].e);
  stk[++stk[0]]=x;
}
void fill_backward(int x)
{
  int i;
  v[x]=false;
  group_num[x]=group_cnt;
  for(i=spr[x];i;i=er[i].nxt) if(v[er[i].e]) fill_backward(er[i].e);
}
void add_edge(int v1, int v2) //add edge v1->v2
{
  e [++E].e=v2; e [E].nxt=sp [v1]; sp [v1]=E;
  er[  E].e=v1; er[E].nxt=spr[v2]; spr[v2]=E;
}
void SCC()
{
  int i;
  stk[0]=0;
  memset(v, false, sizeof(v));
  for(i=1;i<=V;i++) if(!v[i]) fill_forward(i);
  group_cnt=0;
  for(i=stk[0];i>=1;i--) if(v[stk[i]]){group_cnt++; fill_backward(stk[i]);}
}

void pain()	{
	// ios_base::sync_with_stdio(false);
	// cin.tie(NULL);
	memset(isDeliveryZone, 0, sizeof isDeliveryZone);
	memset(inDeg, 0, sizeof inDeg);
	memset(topOrder, 0, sizeof topOrder);
	memset(marks, 0, sizeof marks);
	memset(sp, 0, sizeof sp);
	memset(spr, 0, sizeof spr);
	memset(v, 0, sizeof v);
	memset(stk, 0, sizeof stk);
	memset(group_num, 0, sizeof group_num);
	deliveryZones.clear();
	topVec.clear();
	for(int i=0; i<N; i++)	{
		g[i].clear();
		G[i].clear();
		ans[i].clear();
	}
	//cin >> n >> m >> k;
    //scanf("%d", &n);
    //cin >> m >> k;
    scanf("%d%d%d", &n, &m, &k);
	V = n; E = 0;
	for(int i=0; i<k; i++)	{
		int x; //cin >> x;
        scanf("%d", &x);
		deliveryZones.push_back(x);
		isDeliveryZone[x] = 1;
	}
	for(int i=0; i<m; i++)	{
		int u, v;
		//cin >> u >> v;
        scanf("%d%d", &u, &v);
		G[u].push_back(v);
		add_edge(u, v);
	}
	SCC();
	for(int i=1; i<=n; i++)	{
		for(int j: G[i])	{
			if(group_num[i] != group_num[j])	{
				g[group_num[i]].push_back(group_num[j]);
			}
		}
	}
	for(int i=1; i<=n; i++)	{
		g[i].resize(unique(g[i].begin(), g[i].end()) - g[i].begin());
	}
	for(int i=1; i<=group_cnt; i++)	{
		for(int j: g[i])	{
			inDeg[j]++;
		}
	}
	queue<int> q;
	for(int i=1; i<=group_cnt; i++)	{
		if(inDeg[i] == 0)	{
			q.push(i);
		}
	}
	memset(seen, 0, sizeof seen);
	int ctrr = 0;
	while(not q.empty())	{
		ctrr++; if(ctrr > 3 * N) break;
		int now = q.front();
		q.pop();
		topVec.push_back(now);
		topOrder[now] = topVec.size();
		for(int next: g[now])	{
			inDeg[next]--;
			if(inDeg[next] == 0)	{
				if(not seen[next])	{
					q.push(next);
				}
			}
		}
	}
	set<int> keyGroups;
	for(int i=1; i<=n; i++)	{
		if(isDeliveryZone[i])	{
			keyGroups.insert(group_num[i]);
		}
	}
	vector<pair<int, int> > groupOrder;
	for(int el: keyGroups)	{
		groupOrder.push_back({topOrder[el], el});
	}
	sort(groupOrder.begin(), groupOrder.end());
	bool reachable = true;
	int toVisit = groupOrder.size(), visited = 1;
	q.push(groupOrder[0].second);
	memset(seen, 0, sizeof seen);
	ctrr = 0;
	while(not q.empty())	{
		ctrr++; if(ctrr > 3 * N) break;
		int now = q.front();
		q.pop();
		if(groupOrder[visited].second == now)	{
			visited++;
		}
		if(visited == toVisit)	{
			break;
		}
		int l = groupOrder[visited - 1].first, r = groupOrder[visited].first;
		for(int next: g[now])	{
			if(not seen[next])	{
				if(topOrder[next] > l and topOrder[next] <= r)	{
					q.push(next);
				}
			}
		}
	}
	if(visited != toVisit)	{
		printf("-1\n");
		return;
	}
	for(int i=1; i<=n; i++)	{
		if(isDeliveryZone[i])	{
			ans[group_num[i]].push_back(i);
		}
	}
	for(int i=1; i<=n; i++)	{
		sort(ans[i].begin(), ans[i].end());
	}
	for(auto el: groupOrder)	{
		for(int x: ans[el.second])	{
			//cout << x << " ";
            printf("%d ", x);
		}
	}
	//cout << "\n";
    printf("\n");
}

int main()	{
	//ios_base::sync_with_stdio(false);
	//cin.tie(NULL);
	int tt; cin >> tt;
	while(tt--)
	pain();
}