#include <string>
#include <vector>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
#include<functional>
#include<list>
#include<deque>
#include<bitset>
#include<set>
#include<map>
#include<unordered_map>
#include<cstring>
#include<sstream>
#include<complex>
#include<iomanip>
#include<numeric>
#define X first
#define Y second
#define pb push_back
#define rep(X,Y) for (int (X) = 0;(X) < (Y);++(X))
#define rrep(X,Y) for (int (X) = (Y)-1;(X) >=0;--(X))
#define repe(X,Y) for ((X) = 0;(X) < (Y);++(X))
#define peat(X,Y) for (;(X) < (Y);++(X))
#define all(X) (X).begin(),(X).end()
#define rall(X) (X).rbegin(),(X).rend()
#define eb emplace_back
#define UNIQUE(X) (X).erase(unique(all(X)),(X).end())

using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
template<class T> using vv=vector<vector<T>>;
template<class T> ostream& operator<<(ostream &os, const vector<T> &t) {
os<<"{"; rep(i,t.size()) {os<<t[i]<<",";} os<<"}"<<endl; return os;}
template<class S, class T> ostream& operator<<(ostream &os, const pair<S,T> &t) { return os<<"("<<t.first<<","<<t.second<<")";}
const ll MOD=1e9+7;
typedef vv<int> Graph;
// SCC
struct Scc{
  stack<int> S;
  vector<int> inS,low,num;
  int time;
public:
  Graph dag;
  vector<int> inv;
  vv<int> scc;
  void visit(const Graph &g, int v){
    low[v] = num[v] = ++time;
    S.push(v); inS[v]=1;
    for(const int  &w:g[v]) {
      if(!num[w]){
	visit(g,w);
	low[v]=min(low[v],low[w]);
      }else if(inS[w])
	low[v]=min(low[v],num[w]);
    }
    if(low[v]==num[v]){
      scc.push_back(vector<int>());
      while(1){
	int w = S.top(); S.pop(); inS[w]=0;
	scc.back().push_back(w);
	if (v==w) break;
      }
    }
  }
  Scc(const Graph &g) {
    const int n = g.size();
    num.resize(n); low.resize(n); inS.resize(n);
    rep(u,n) if(!num[u])
      visit(g,u);
    reverse(all(scc));
    
    inv.resize(n); dag.resize(n);
    rep(i,scc.size()) rep(j,scc[i].size())
      inv[scc[i][j]]=i;
    rep(i,scc.size()) rep(j,scc[i].size())
      for(auto e:g[scc[i][j]])
	if(inv[e] != i)
	  dag[i].pb(inv[e]);
  }
};

bool ok(vv<int> &g,vector<int> &a){
  if(a.size()<=1) return 1;
  queue<int> que;
  int t=0,n=g.size();
  vector<int> vst(n);
  que.push(a[t]);
  ++t;
  //cout<<a;
  while(!que.empty()){
    if(que.size()>1e7)return 1;
    int v=que.front(); que.pop();
    if(v>=n)continue;
    //cout<<v<<endl;
    if(v==a[t]){
      while(!que.empty()){
	vst[que.front()]=0;
	que.pop();
      }
      ++t;
    }
    if(t>=a.size()) return 1;
    for(const int &x:g[v]){
      if(x!=v)
	que.push(x);
    }
  }
  return 0;
}

int main(){
  ios_base::sync_with_stdio(false);
  cout<<fixed<<setprecision(0);
  int T;
  cin>>T;
  while(T--){
    int n,m,t;
    cin>>n>>m>>t;
    vector<int> dsts(t);
    rep(i,t){
      cin>>dsts[i]; --dsts[i];
    }
    vv<int> g(n);
    int x,y;
    rep(i,m){
      cin>>x>>y; --x; --y;
      g[x].pb(y);
    }
    Scc a(g);
    //cout<<a.scc<<a.dag;

    const int N=a.scc.size();
    vv<int> dst(N);
    rep(i,t)
      dst[a.inv[dsts[i]]].pb(dsts[i]);
    vector<int> poyo;
    rep(i,N)if(dst[i].size()){
      sort(all(dst[i]));
      poyo.pb(i);
    }
    //cout<<dst;
    if(ok(a.dag,poyo)){
      rep(i,N)
	for(const int &x:dst[i])
	  cout<<x+1<<" ";
      cout<<endl;
    }else{
      cout<<-1<<endl;
    }
  }
  return 0;
}