#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; }