#include <bits/stdc++.h>

using namespace std;

vector<int> sz, root;
int ba, bb;

void dfs(int a, vector<int> used, vector<vector<int>> g)
{
    used[a]=1;
    for (auto i:g[a])
    {
        if(used[i]==0)
            dfs(i, used, g);
    }
}

bool bridge(int a, int b, vector<int> 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> l(s);
        vector<vector<int>> g(n+1);
        vector<pair<int,int>> g1;
        for (int i=0; i<s; i++)
        {
            cin >> l[i];
        }
        for (int i=0; i<m; i++)
        {
            cin >> a >> b;
            g[a].push_back(b);
            g[b].push_back(a);
            g1.push_back({a,b});
        }
        bool f=true;
        if(m==n-1)
        {
            for (int i=0;i<s; i++)
            {
                if(g[l[i]].size()>1)
                {
                    f=false;
                }
            }
            if(f)
            {
                cout << m << endl;
                for (int i=0;i<m;i++)
                {
                    cout << g1[i].first << " " << g1[i].second << endl;
                }
            }
            else
                cout << -1;
        }
    }
}