#include <cstdio> #include <iostream> #include <cmath> #include <algorithm> #include <string.h> #include <stack> #include <vector> #define f first #define s second using namespace std; bool a[100005] ; vector<int>v[100005] ; vector<int>u[100005] ; vector<int>vv[100005] ; vector<int>vr[100005] ; vector<int>com[100005] ; bool vis[100005] ; stack<int>st ; int counter ; int ind ; int parent[100005] , s[100005] ; stack<int>ans; void dfs1(int x){ vis[x] = true ; for(int i = 0 ;i < v[x].size() ; i++){ if(!vis[v[x][i]])dfs1(v[x][i]) ; } st.push(x) ; } void dfs2(int x){ vis[x] = true ; for(int i = 0 ; i < u[x].size() ; i++){ if(!vis[u[x][i]])dfs2(u[x][i]) ; } parent[x] = ind ; if(a[x])com[ind].push_back(x); } void dfs3(int x){ vis[x] = true ; for(int i = 0 ;i < v[x].size() ; i++){ int y = v[x][i] ; int l = parent[x] , r = parent[y] ; if(l == r)continue ; vv[l].push_back(r) ; if(!vis[y])dfs3(y) ; } } int z = 0; int dfs4(int x){ int &ret = s[x] ; if(vis[x])return s[x] ; vis[x] = true ; ret = 0 ; for(int i=0;i<vv[x].size();i++){ if(i > 0 && vv[x][i] == vv[x][i-1])continue ; ret = max(ret,dfs4(vv[x][i])); } ans.push(x) ; ret += com[x].size() ; return ret ; } void dfs(int x){ vis[x] = true ; for(int i = 0 ; i < com[x].size() ; i++)cout << com[x][i] << " " ; int l = com[x].size() ; for(int i = 0 ; i < vv[x].size() ; i++){ if(!vis[vv[x][i]] && s[vv[x][i]] == s[x] - l){ dfs(vv[x][i]) ; break ; } } } int main(){ int t ;scanf("%d",&t) ; int n , m , k ; for(int I = 1 ; I <= t ; I++){ scanf("%d%d%d",&n,&m,&k) ; for(int i = 1 ;i <= n ; i++){ v[i].clear() ; vv[i].clear() ; u[i].clear() ; com[i].clear() ; a[i] = false ; s[i] = 0 ; } for(int i = 1 ; i <= k ; i++){ int x ;scanf("%d",&x) ; a[x] = true ; } memset(vis,0,sizeof(vis)) ; for(int i = 0 ;i < m ; i++){ int x , y ; scanf("%d%d",&x,&y) ; v[x].push_back(y) ; u[y].push_back(x) ; } for(int i = 1 ; i <= n ; i++){ if(!vis[i]){ dfs1(i) ; } } memset(vis,0,sizeof(vis)) ; for(int i = 1 ;i <= n ; i++)parent[i] = i ; ind = 0 ; counter = 0 ; while(!st.empty()){ int x = st.top() ;st.pop() ; if(!vis[x]){ ind ++ ; dfs2(x) ; sort(com[ind].begin(),com[ind].end()) ; } } memset(vis,0,sizeof(vis)) ; bool flag = false ; for(int i = 1 ; i <= n ; i++){ if(!vis[i]){ dfs3(i) ; } } memset(vis,0,sizeof(vis)) ; z = 0 ; for(int i = 1 ; i <= n ; i++){ sort(vv[i].begin(),vv[i].end()) ; } int start = 0 ; for(int i=1;i<=ind;i++){ if(!vis[i]){ z ++ ; int c = dfs4(i); if(c == k){ flag = true ; start = i ; } } } if(!flag){ printf("-1\n") ; continue ; } memset(vis,0,sizeof(vis)) ; dfs(start) ; printf("\n"); } return 0 ; }