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

#define PB push_back
#define MP make_pair
#define SZ size()
#define all(v) v.begin(), v.end()
#define REP(i, n) for(int i = 0; i < (int)n; i++)
#define ITR(i, j, n) for(int i = j; i < (int)n; i++)
#define mem(array, val) memset(array, val, sizeof(array))
#define READ(filename) freopen(filename, "r", stdin)
#define WRITE(filename) freopen(filename, "w", stdout)
#define Pii pair <int, int>
#define Fr first
#define Sc second
#define Long long long
#define si(a) scanf("%d", &a)
#define sl(a) scanf("%lld", &a)
#define sd(a) scanf("%lf", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define sll(a, b) scanf("%lld%lld", &a, &b)
#define sdd(a, b) scanf("%lf%lf", &a, &b)
#define Fast_IO ios_base::sync_with_stdio(0);cin.tie(0)

#define MAX 100005
int N, M, K;
bool inStack[MAX], dlv[MAX], mark[MAX];
int disc[MAX], low[MAX], comp[MAX], components, Tm;
vector <int> adj[MAX];
vector < vector <int> > vec;
stack <int> S;
set <int, greater<int> > st[MAX];

void dfs(int nd)
{
   disc[nd] = low[nd] = ++Tm;
   S.push(nd);
   inStack[nd] = true;
   REP(i, adj[nd].SZ) {
      int ch = adj[nd][i];
      if(!disc[ch]) {
         dfs(ch);
         low[nd] = min(low[nd], low[ch]);
      }
      else if(inStack[ch]) {
         low[nd] = min(low[nd], disc[ch]);
      }
   }

   if(low[nd] == disc[nd]) {
      comp[nd] = components++;
      int u;
      vector <int> tmp;
      do {
         u = S.top();
         S.pop();
         inStack[u] = false;
         comp[u] = comp[nd];
         if(dlv[u]) { tmp.PB(u); dlv[u] = 0; }
      } while(u != nd);
      vec.PB(tmp);
   }
}

bool find(int nd, int dest)
{
   if(nd == dest) return true;
   //cout << nd << ' ' << dest << endl;
   bool ret = false;
   mark[nd] = true;
   for(set <int, greater <int> >::iterator it = st[nd].begin(); it != st[nd].end(); it++) {
      if(*it < dest || mark[*it] == true) continue;
      ret |= find(*it, dest);
      if(ret) return ret;
   }
   return ret;
}

void init()
{
   mem(inStack, 0);
   mem(dlv, 0);
   mem(mark, 0);
   mem(disc, 0);
   mem(low, 0);
   components = Tm = 0;
   REP(i, MAX) { adj[i].clear(); st[i].clear(); }
   vec.clear();
}

void print_SCC()
{
   REP(i, vec.SZ) {
      printf("Comp: %d\n", i);

      REP(j, vec[i].SZ) {
         if(j) printf(" ");
         printf("%d", vec[i][j]);
      }
      puts("");
   }
}

void solve()
{
   ITR(i, 1, N+1) if(!disc[i]) dfs(i);
   //print_SCC();
   ITR(i, 1, N+1) REP(j, adj[i].SZ) if(comp[i] != comp[ adj[i][j] ]) {
      st[ comp[i] ].insert(comp[ adj[i][j] ]);
   }

   vector <int> ans;
   int prev = -1;
   for(int i = components-1; i >= 0; i--) if(vec[i].SZ > 0) {
      if(prev != -1 && find(prev, i) == false) {
         printf("-1\n");
         return;
      }
      sort(all(vec[i]));
      REP(j, vec[i].SZ) ans.PB(vec[i][j]);
      prev = i;
   }
   REP(i, ans.SZ) {
      if(i) printf(" ");
      printf("%d", ans[i]);
   }
   puts("");
}

int main()
{
   int t;
   si(t);
   while(t--) {
      init();
      sii(N, M);
      si(K);
      REP(i, K) {
         int u;
         si(u);
         dlv[u] = 1;
      }
      REP(i, M) {
         int u, v;
         sii(u, v);
         adj[u].PB(v);
      }

      solve();
   }

   return 0;
}