#include <iostream> #include <cstdio> #include <cstdlib> #include <vector> #include <algorithm> #include <cstring> #include <string> #include <set> #include <map> #include <cmath> #include <ctime> #include <sstream> #include <fstream> #include <functional> using namespace std; #ifdef LOCAL #define eprintf(...) fprintf(stderr, __VA_ARGS__) #else #define eprintf(...) 42 #endif typedef long long ll; typedef pair<int, int> pii; #define X first #define Y second #define mp make_pair const int N = (int)1e5 + 10; vector <int> g[N], gT[N], gC[N]; int topSort[N]; int cntT = 0, cc = 0; int needComp[N]; vector <int> vComp[N]; int need[N], dp[N]; int color[N]; int used[N]; int n, m, k; void init() { cntT = 0; cc = 0; for (int i = 0; i < n; i++) { used[i] = 0; g[i].clear(); gT[i].clear(); gC[i].clear(); color[i] = -1; vComp[i].clear(); needComp[i] = 0; dp[i] = 0; } } void read() { scanf("%d%d%d", &n, &m, &k); init(); for (int i = 0; i < k; i++) { scanf("%d", &need[i]); need[i]--; } for (int i = 0; i < m; i++) { int a, b; scanf("%d%d", &a, &b); a--, b--; g[a].push_back(b); gT[b].push_back(a); } } void dfsTopSort(int v) { used[v] = 1; for (int to : g[v]) { if (!used[to]) dfsTopSort(to); } topSort[cntT++] = v; } void paint(int v, int c) { color[v] = c; for (int to : gT[v]) { if (color[to] == -1) paint(to, c); else if (color[to] != color[v]) gC[color[to]].push_back(c); } } void printComp(int id) { sort(vComp[id].begin(), vComp[id].end()); for (int x : vComp[id]) printf("%d ", x + 1); } void solve() { for (int i = 0; i < n; i++) { if (!used[i]) dfsTopSort(i); } for (int i = cntT - 1; i >= 0; i--) { int v = topSort[i]; if (color[v] == -1) paint(v, cc++); } for (int i = 0; i < k; i++) { needComp[color[need[i]]] = 1; vComp[color[need[i]]].push_back(need[i]); } int v = -1; for (int i = cc - 1; i >= 0; i--) { dp[i] = (int)vComp[i].size(); for (int to : gC[i]) dp[i] = max((int)vComp[i].size() + dp[to], dp[i]); if (dp[i] == k) v = i; } if (v == -1) { puts("-1"); return; } while (k > 0) { printComp(v); k -= (int)vComp[v].size(); for (int to : gC[v]) { if (dp[to] == k) v = to; } } puts(""); } int main() { int t; scanf("%d", &t); for (int i = 0; i < t; i++) { read(); solve(); } return 0; }