#include <cstdlib> #include <cctype> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <string> #include <iostream> #include <sstream> #include <map> #include <set> #include <queue> #include <stack> #include <fstream> #include <numeric> #include <iomanip> #include <bitset> #include <list> #include <stdexcept> #include <functional> #include <utility> #include <ctime> using namespace std; typedef long long LL; #define rep(it,s) for(__typeof((s).begin()) it=(s).begin();it!=(s).end();it++) int n, m, k; int teller, vlowlink[100010], vlink[100010]; stack<int> S; int situatie[100010]; // 0 = not seen yet, 1 = in stack, 2 = processed vector<int> e[100010]; int sccnr[100010], cur; set<int> out[100010], in[100010]; bool need[100010]; int a[100010]; vector<int> ans; bool bad; vector<int> w[100010]; bool vis[100010]; int b[100010]; int dist[100010], pre[100010]; void sccrec (int v) { vlink[v] = vlowlink[v] = teller++; S.push(v); situatie[v] = 1; int j, buur; for (j = e[v].size()-1; j >= 0; j--) if (situatie[buur = e[v][j]] < 2) { if (situatie[buur] == 0) sccrec(buur); vlowlink[v] = min(vlowlink[v], vlowlink[buur]); } if (vlowlink[v] == vlink[v]) { int w; do { sccnr[w = S.top()] = cur; situatie[w] = 2; S.pop(); } while (w != v); cur++; } } void strongly_connected_components (int n) { memset(situatie, 0, sizeof(situatie)); teller = cur = 0; for (int i = 0; i < n; i++) if (situatie[i] < 2) sccrec(i); } int main() { //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); int tt; cin>>tt; while (tt--) { cin>>n>>m>>k; for(int i=0; i<n; i++) b[i] = 0; for (int i=0; i<n; i++) e[i].clear(); for (int i=0; i<k; i++) { scanf("%d", &a[i]); a[i]--; b[a[i]] = 1; } for (int i=0; i<m; i++) { int x, y; scanf("%d%d", &x, &y); x--; y--; if (x!=y) e[x].push_back(y); } strongly_connected_components(n); for (int i=0; i<n; i++) need[i] = 0; for (int i=0; i<k; i++) need[sccnr[a[i]]] = 1; vector<int> v; for (int i=0; i<n; i++) vis[i] = 0; for (int i=0; i<n; i++) if (!vis[sccnr[i]]) { v.push_back(sccnr[i]); vis[sccnr[i]] = 1; } bool special = 0; for (int i=0; i<n; i++) in[i].clear(); for (int i=0; i<n; i++) out[i].clear(); for (int i=0; i<n; i++) w[i].clear(); for (int i=0; i<n; i++) if (b[i]) { w[sccnr[i]].push_back(i); } for (int i=0; i<n; i++) { sort(w[i].begin(), w[i].end()); } for (int i=0; i<n; i++) { for (int j=0; j<e[i].size(); j++) { if (sccnr[i]!=sccnr[e[i][j]]) { out[sccnr[i]].insert(sccnr[e[i][j]]); in[sccnr[e[i][j]]].insert(sccnr[i]); } } } bad = 0; ans.clear(); for (int i=0; i<n; i++) vis[i] = 0; queue<int> q; for (int i=0; i<n; i++) dist[i] = -n*10; for (int i=0; i<n; i++) pre[i] = -1; for (int i=0; i<v.size(); i++) { if (in[v[i]].size()==0) { q.push(v[i]); vis[v[i]] = 1; dist[v[i]] = 0; } } v.clear(); while (!q.empty()) { int k = q.front(); q.pop(); v.push_back(k); rep(it, out[k]) { in[*it].erase(k); } rep(it, out[k]) { if (in[*it].size()==0 && !vis[*it]) { q.push(*it); vis[*it] = 1; } } } for (int i=0; i<v.size(); i++) { rep(it, out[v[i]]) { int c = 0; if (need[*it]) c = 1; if (dist[*it] < dist[v[i]] + c) { dist[*it] = dist[v[i]] + c; pre[*it] = v[i]; } } } ans.clear(); for (int i=v.size()-1; i>=0; i--) { if (need[v[i]]) { int t = v[i]; while (t!=-1) { if (need[t]) ans.push_back(t); t = pre[t]; } break; } } reverse(ans.begin(), ans.end()); if (bad) { cout<<-1<<endl; } else { v.clear(); v.reserve(k); for (int i=0; i<ans.size(); i++) { for (int j=0; j<w[ans[i]].size(); j++) { v.push_back(w[ans[i]][j]); } } if (v.size()!=k) { cout<<-1<<endl; } else { for (int i=0; i<k; i++) { cout<<v[i]+1<<" "; } cout<<endl; } } } return 0; }