/* */ //#pragma comment(linker, "/STACK:16777216") #include <fstream> #include <iostream> #include <string> #include <complex> #include <math.h> #include <set> #include <vector> #include <map> #include <queue> #include <stdio.h> #include <stack> #include <algorithm> #include <list> #include <ctime> #include <memory.h> #include <ctime> #include <assert.h> #define y0 sdkfaslhagaklsldk #define y1 aasdfasdfasdf #define yn askfhwqriuperikldjk #define j1 assdgsdgasghsf #define tm sdfjahlfasfh #define lr asgasgash #define eps 1e-6 #define M_PI 3.141592653589793 #define bs 1000000007 #define bsize 512 using namespace std; int tests,n,m,k; vector<int> need; vector<int> g[1<<20],gr[1<<20]; vector<int> order; int used[1<<20]; int comps; void dfs1(int v) { used[v]=1; for (int i=0;i<g[v].size();i++) { int to=g[v][i]; if (used[to]) continue; dfs1(to); } order.push_back(v); } void dfs2(int v) { used[v]=comps; for (int i=0;i<gr[v].size();i++) { int to=gr[v][i]; if (used[to]) continue; dfs2(to); } } set<pair<int, int> > edges; int dp[1<<20]; vector<int> G[1<<20]; int totake[1<<20]; vector<int> gg[1<<20]; int cost[1<<20]; vector<int> ans; int main(){ //freopen("beavers.in","r",stdin); //freopen("beavers.out","w",stdout); //freopen("F:/in.txt","r",stdin); //freopen("F:/output.txt","w",stdout); ios_base::sync_with_stdio(0); //cin.tie(0); cin>>tests; for (;tests;--tests) { cin>>n>>m>>k; need.clear(); for (int i=1;i<=k;i++) { int val; cin>>val; need.push_back(val); } for (int i=1;i<=n;i++) g[i].clear(), gr[i].clear(); for (int i=1;i<=m;i++) { int a,b; cin>>a>>b; g[a].push_back(b); gr[b].push_back(a); } order.clear(); for (int i=1;i<=n;i++) used[i]=0; for (int i=1;i<=n;i++) { if (used[i]) continue; dfs1(i); } for (int i=1;i<=n;i++) used[i]=0; reverse(order.begin(),order.end()); comps=0; for (int i=0;i<order.size();i++) { int v=order[i]; if (used[v]) continue; ++comps; dfs2(v); } edges.clear(); for (int i=1;i<=n;i++) dp[i]=0, G[i].clear(), gg[i].clear(); for (int i=1;i<=n;i++) { int v1=i; for (int j=0;j<g[i].size();j++) { int to=g[i][j]; if (used[v1]==used[to]) continue; pair<int, int> tp=make_pair(used[v1],used[to]); if (edges.find(tp)!=edges.end()) continue; edges.insert(tp); G[tp.first].push_back(tp.second); } } /* for (int i=1;i<=comps;i++) { cout<<i<<": "; for (int j=0;j<G[i].size();j++) cout<<G[i][j]<<" "; cout<<endl; } for (int i=1;i<=n;i++) cout<<used[i]<<" "; cout<<endl; */ for (int i=1;i<=n;i++) cost[i]=0; for (int i=0;i<need.size();i++) { int v=used[need[i]]; cost[v]++; gg[v].push_back(need[i]); } for (int i=1;i<=comps;i++) { sort(gg[i].begin(),gg[i].end()); dp[i]+=cost[i]; for (int j=0;j<G[i].size();j++) { int to=G[i][j]; dp[to]=max(dp[to],dp[i]); } } int found=-1; for (int i=1;i<=comps;i++) { if (dp[i]==need.size()) found=1; } if (found==-1) { cout<<-1<<endl; continue; } ans.clear(); for (int i=1;i<=n;i++) totake[i]=0; for (int i=0;i<need.size();i++) totake[need[i]]=1; for (int i=1;i<=comps;i++) for (int j=0;j<gg[i].size();j++) if (totake[gg[i][j]]) ans.push_back(gg[i][j]); for (int i=0;i<ans.size();i++) { if (i) cout<<" "; cout<<ans[i]; } cout<<endl; } //cin.get();cin.get(); return 0;}