#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;

}