#include <bits/stdc++.h>
#define gcd         __gcd
#define bitcount    __builtin_popcountll
#define rep(i,j,n)  for(i=j;i<n;i++)
#define tr(it,c)    for(auto it=(c).begin();it!=(c).end();it++)
#define pb          push_back
#define mp          make_pair
#define hell        1000000007
#define uset        unordered_set
#define umap        unordered_map
#define ft          first
#define sc          second
using namespace std;
typedef pair<int,int> pi;
typedef long long ll;

template <class T> T& get(T &n) {
    cin>>n;
    return n;
}

struct Graph{
    int N;
    vector<vector<int>> adj;
    vector<bool> visited;
    Graph(int N):N(N),adj(N),visited(N,0){
    }
    void addEdge(int i,int j){
        adj[i].push_back(j);
    }
    void reverse(Graph &rev)const{
        int i;
        rep(i,0,N){
            tr(it2,adj[i]){
                int j=*it2;
                rev.adj[j].push_back(i);
            }
        }
    }
    void solve(vector<int> &label){
        fill(visited.begin(), visited.end(), 0);
        stack<int> s;
        int i;
        rep(i,0,N){
            if(!visited[i])
                dfs1(i,s);
        }
        
//        stack<int> t=s;
//        cerr<<"Stack:";
//        while(!t.empty()){
//            cerr<<t.top()<<' ';
//            t.pop();
//        }
//        cerr<<endl;
        
        Graph rev(N);
        reverse(rev);
        rev.applyLabel(s,label);
    }
    void dfs1(int x,stack<int> &s){
        if(!visited[x]){
            visited[x]=1;

            tr(it,adj[x]){
//                cerr<<"Calling "<<*it<<" from "<<x<<endl;
                dfs1(*it,s);
            }
            s.push(x);
        }
    }
    void applyLabel(stack<int> &s,vector<int> &label)const{
        vector<bool> visited(N,0);
        int val=0;
        while(!s.empty()){
            int x=s.top();s.pop();
            if(!visited[x]){
                dfs2(x,visited,label,++val);
            }
        }
    }
    void dfs2(int x,vector<bool> &vis,vector<int> &label,int val)const{
        if(!vis[x]){
            vis[x]=1;
            label[x]=val;
            
            tr(it,adj[x])
                dfs2(*it,vis,label,val);
        }
    }
    void print(){
        int i;
        rep(i,0,N){
            cerr<<i<<":";
            tr(it,adj[i])
                cerr<<*it<<' ';
            cerr<<endl;
        }
    }
    void dfs3(int x,vector<bool> &vis,vector<int> &tl,vector<int> &idx,vector<int> &trace){
        if(!vis[x]){
            vis[x]=1;
            tr(it,adj[x]){
                dfs3(*it,vis,tl,idx,trace);
                if(binary_search(tl.begin(), tl.end(), *it)){
                    int t=lower_bound(tl.begin(), tl.end(), *it)-tl.begin();
                    if(t<idx[x]){
                        idx[x]=t;
                        trace[x]=*it;
                    }
                }
                if(idx[*it]<idx[x]){
                    idx[x]=idx[*it];
                    trace[x]=*it;
                }
            }
        }
    }
    bool check(int x,vector<int> &idx,vector<int> &trace,int K){
        while(idx[x]!=K && trace[x]!=-1){
            if(trace[x]==-1 || idx[trace[x]]-idx[x]>1){
//                cerr<<x<<' '<<trace[x]<<' '<<idx[x]<<' '<<idx[trace[x]]<<endl;
                return 0;
            }
            x=trace[x];
//            cerr<<"Here "<<x<<endl;
        }
        return 1;
    }
};

void printVector(const vector<int> &v,string name){
    int i,N=v.size();
    cerr<<name<<":";
    rep(i,0,N)
        cerr<<v[i]<<' ';
    cerr<<endl;
}

int main() {
    int T;
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    get(T);
    while(T--) {
        int N,M,K,i;
        cin>>N>>M>>K;
        vector<int> target(K);
        rep(i,0,K){
            get(target[i])--;
        }
        Graph g(N);
        vector<pi> e(M);            //
        rep(i,0,M){
            int x,y;
            cin>>x>>y;
            x--;y--;
            g.addEdge(x,y);
            e[i]={x,y};             //
        }
//        g.print();
        vector<int> label(N);
        g.solve(label);
//        rep(i,0,N){
//            cerr<<i<<":"<<label[i]<<endl;
//        }
        sort(target.begin(), target.end(), [&](int x,int y){
            return ((label[x]==label[y])&&(x<y))||(label[x]<label[y]);
        });

        vector<int> tl;
        set<int> tls;
        rep(i,0,K){
            tls.insert(label[target[i]]);
        }
        int tlc=tls.size();
        tr(it,tls){
            tl.push_back(*it);
        }
//        printVector(tl,string("tl"));

        set<pi> s;
        rep(i,0,M){                 //
            e[i].ft=label[e[i].ft];
            e[i].sc=label[e[i].sc];
            assert(e[i].ft<=e[i].sc);
            if(e[i].ft!=e[i].sc)
                s.insert(e[i]);
        }

        Graph mg(N+1);
        vector<bool> vis(N+1,0);
        vector<int> idx(N+1,tlc);
        vector<int> trace(N+1,-1);
        tr(it,s){
            mg.addEdge(it->first,it->second);
        }
//        mg.print();
        mg.dfs3(tl[0],vis,tl,idx,trace);
//        printVector(idx,string("idx"));
//        cerr<<"idx[1]="<<idx[1]<<endl;
        if(idx[tl[0]]!=1 || !mg.check(tl[0],idx,trace,tlc)){
            cout<<"-1\n";
            continue;
        }

        rep(i,0,K){
            cout<<(target[i]+1)<<' ';
        }
        cout<<"\n";
    }
    return 0;
}