#include <bits/stdc++.h>

using namespace std;

vector<int> sz, root;
int cnt, c1, c2;

pair<int,int> correct(int a, int b)
{
    if(a>b)
        swap(a,b);
    return {a,b};
}

void dfs(int a, vector<int> used, vector<map<int,int>> g)
{
    used[a]=1;
    cnt++;
    for (auto i:g[a])
    {
        if((c1==a && c2==i.first) || (c1==i.first && c2==a)) continue;
        if(used[i.first]==0)
            {
                dfs(i.first, used, g);
            }
    }
}

void build (int n)
{
    sz=vector<int>(n, 1);
    root=vector<int>(n);
    for (int i=0; i<n; i++)
        root[i]=i;
}

int get_root(int i)
{
    if (root[i]=i)
        return i;
    return root[i]=get_root(root[i]);
}

bool union_sets(int a, int b)
{
    a=get_root(a);
    b=get_root(b);
    if(a==b)
        return false;
    if  (sz[a]<sz[b])
        swap(a,b);
    root[b]=a;
    sz[a]+=sz[b];
    return true;
}

int main()
{
    int t, n, m, s,a ,b ;
    cin >> t;
    while(t>0)
    {
        t--;
        cin >> n >> m >> s;
        vector<int> izb(s);
        vector<map<int,int>> g(n+1);
        map<pair<int,int>, int> gp;
        vector<int> used(n+1, 0);
        for (int i=0; i<s; i++)
        {
            cin >> izb[i];
        }
        for (int i=0; i<m; i++)
        {
            cin >> a >> b;
            g[a][b]=1;
            g[b][a]=1;
            gp[(correct(a,b))]=1;
        }
        bool f=true;
        if(m==n-1)
        {
            for(int i=0; i<s; i++)
            {
                if(g[izb[i]].size()>1)
                    f=false;
            }
            if(f)
            {
                cout << m << endl;
                for (auto &i :gp)
                {
                    cout << i.first.first << " " << i.first.second << endl;
                }
            }
            else
                cout << -1;
        }
        else
        {
            for (int i=0;i<s; i++)
        {
            for (int j=0;j<g[izb[i]].size(); j++)
            {
                cnt=0;
                used=vector<int>(n+1, 0);
                c1=a=izb[i]; c2=b=g[izb[i]][j];
                dfs(izb[i], used, g);
                if(cnt==n)
                {
                       gp.erase(correct(izb[i],g[izb[i]][j]));
                       g[a].erase(b);
                       g[b].erase(a);
                }
            }
        }
        bool f=true;
        for (int i=0;i<s; i++)
        {
            if(g[izb[i]].size()>1)
            {
                f=false;
            }
        }
        if(f)
        {
            int used=0;
            build(n);
            vector<pair<int,int>> ans;
            for (auto i:gp)
            {
                if(union_sets(i.first.first, i.first.second))
                {
                    used++;
                    ans.push_back({i.first.first, i.first.second});
                }
                if(used==n-1)
                    break;
            }
            if(used<n-1)
                cout << -1;
            else
            {
                cout << ans.size() << endl;
                for (auto i:ans)
                {
                    cout << i.first << " " << i.second << endl;
                }
            }
        }
        else
            cout << -1 << endl;
        }

    }
}