#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <string> #include <vector> #include <stack> #include <queue> #include <set> #include <cstring> #include <map> #include <cstdlib> #define f first #define s second #define ll long long #define ull unsigned long long #define mp make_pair #define pb push_back #define vi vector <int> #define pii pair<int, int> using namespace std; const int N = int(4e5); int T,n,m,k; vi g[N],ans[N],order,gr[N],tps; bool good[N]; int comp[N]; bool used[N]; int x[N],y[N]; int cnt; bool ok[N][3]; void dfs1(int v){ used[v] = 1; for(int i=0;i<g[v].size();i++){ if(!used[g[v][i]]){ dfs1(g[v][i]); } } order.pb(v); } void dfs2(int v){ used[v] = 1; comp[v] = cnt; if(good[v]){ ans[cnt].pb(v); } for(int i=0;i<gr[v].size();i++){ if(!used[gr[v][i]]){ dfs2(gr[v][i]); } } } void dfs(int v){ used[v] = 1; for(int i=0;i<g[v].size();i++){ if(!used[g[v][i]]){ dfs(g[v][i]); } } tps.pb(v); } void dfss(int v,int u){ ok[v][u] = 1; if(!u){ for(int i=0;i<g[v].size();i++){ int to = g[v][i]; if(!ok[to][0]){ dfss(to,0); } } } else{ for(int i=0;i<gr[v].size();i++){ int to = gr[v][i]; if(!ok[to][1]){ dfss(to,1); } } } } int main () { scanf("%d",&T); while(T--){ scanf("%d%d%d",&n,&m,&k); for(int i=1,v;i<=k;i++){ scanf("%d",&v); good[v] = 1; } for(int i=1,u,v;i<=m;i++){ scanf("%d%d",&u,&v); g[u].pb(v); gr[v].pb(u); x[i] = u; y[i] = v; } bool yes = 1; for(int i=1;i<=n;i++) if(good[i]){ dfss(i,0); dfss(i,1); for(int j=1;j<=n;j++){ if(good[j] && !ok[j][0] && !ok[j][1]) yes = 0; } break; } if(!yes){ puts("-1"); for(int i=1;i<=n;i++){ g[i].clear(); good[i] = 0; gr[i].clear(); ans[i].clear(); used[i] = 0; ok[i][1] = ok[i][0] = 0; } order.clear(); tps.clear(); continue; } cnt = 0; for(int i=1;i<=n;i++) if(!used[i]) dfs1(i); memset(used,0,sizeof(used)); for(int i=1;i<=n;i++){ int v = order[n - i]; if(!used[v]){ cnt++; dfs2(v); } } for(int i=1;i<=n;i++) { g[i].clear(); } for(int i=1;i<=m;i++){ g[comp[x[i]]].pb(comp[y[i]]); } memset(used,0,sizeof(used)); for(int i=1;i<=cnt;i++){ if(!used[i]) dfs(i); } reverse(tps.begin(),tps.end()); for(int i=0;i<tps.size();i++){ sort(ans[tps[i]].begin(),ans[tps[i]].end()); for(int j=0;j<ans[tps[i]].size();j++){ printf("%d ",ans[tps[i]][j]); } } puts(""); for(int i=1;i<=n;i++){ g[i].clear(); good[i] = 0; gr[i].clear(); ans[i].clear(); used[i] = 0; ok[i][1] = ok[i][0] = 0; } order.clear(); tps.clear(); } return 0; }