#include <bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
int T, N, M, S, A[100005], IN[100005], dis[100005];
vector<int>V[100005], B;
bool vis[100005], oznacen[100005];
vector<pair<int, int> > D;
vector<pair<int, int> > sol;
unordered_map<ll, int> MP;
void dfs(int x, int p = 0)
{
    vis[x] = 1;
    for(int u : V[x])
    {
        if(u == p)continue;
        dfs(u, x);
    }
}
//void dfsSet1(int x, int p = 0)
//{
//    vis[x] = 1;
//    for(int u : V[x])
//    {
//        if(u == p || !Mat[u][x])continue;
//        dfsSet1(u, x);
//    }
//}
//void set1()
//{
//    for(int i = 0; i < D.size(); i++){ pair<int, int> p = D[i];Mat[p.first][p.second] = true;Mat[p.second][p.first] = true;}
//    for(int i = 0; i < (1 << (M + 1)) - 1; i++)
//    {
////        for(int j = 1; j <= N; j++)
////        {
////            for(int k = 1; k <= N; k++)cout << Mat[i][j] << ' ';
////            cout << '\n';
////        }
//        memset(vis, 0, sizeof(vis));
//        for(int j = 0; j < D.size(); j++){pair<int, int> p = D[j];Mat[p.first][p.second] = true;Mat[p.second][p.first] = true;}
//        int B = i;
//        for(int j = 0; j < M; j++)
//        {
//            Mat[D[j].first][D[j].second] = (B & 1);Mat[D[j].second][D[j].first] = (B & 1);
//            B >>= 1;
//        }
//        bool flag1 = false, flag2 = false;
//        for(int j = 1; j <= S; j++)
//        {
//            int br = 0;
//            for(int k = 1; k <= N; k++)
//            {
//                br += Mat[j][k];
//            }
//            if(br > 1){flag1 = true; break;}
//        }
//        if(flag1)continue;
//        dfsSet1(1);
//        for(int i = 1; i <= N; i++)if(!vis[i]){flag2 = true;break;}
//        if(flag2)continue;
//        int br = 0;
//        vector<pair<int, int> > sol;
//        for(int j = 1; j <= N; j++)
//        {
//            for(int k = 1; k <= N; k++)
//            {
//                br += Mat[j][k];
//                if(Mat[j][k])
//                sol.pb({j, k});
//            }
//        }
//        for(int j = 0; j < sol.size(); j++)
//        {
//            pair<int, int> p = sol[j];
//            for(int k = 0; k < D.size(); k++)
//            {
//                pair<int, int>x = D[k];
//                if(p.first == x.second && p.second == x.first)swap(p.first, p.second);
//            }
//        }
//        cout << br << '\n';
//        for(pair<int, int> p : sol)cout << p.first << ' ' << p.second << '\n';
//        return;
//    }
//    cout << -1 << '\n';
//}
void dfsNeoznaceni(int x, int p = 0)
{
//    cout << x << '\n';
    vis[x] = 1;
    for(int i = 0; i < V[x].size(); i++)
    {
        int u = V[x][i];

//        cout << " " << u << '\n';
        if(u == p || oznacen[u] || vis[u])continue;

        dfsNeoznaceni(u, x);

        sol.pb({u, x});
    }
}
void set3()
{
    if(S == N){cout << -1 << '\n';}
    if(S == N - 1)
    {
        int idx;
        for(int i = 1; i <= N; i++)
        {
            if(!oznacen[i])idx = i;
        }
        queue<int>Q;
        Q.push(idx);
        dis[idx] = 0;
        while(Q.size())
        {
            int x = Q.front();

            vis[x] = true;
            for(int i = 0; i < V[x].size(); i++)
            {
                int u = V[x][i];
                if(!vis[u])Q.push(u), dis[u] = dis[x] + 1, vis[u] = true;
            }
            Q.pop();
        }
        for(int i = 1; i <= S; i++)
        {
            if(dis[A[i]] != 1)
            {
                cout << -1 << '\n';
                return;
            }
        }
        cout << N - 1 << '\n';
        for(int i = 0; i < D.size(); i++)
        {
            if(D[i].first == idx || D[i].second == idx)cout << D[i].first << ' ' << D[i].second << '\n';
        }
    }
    if(S == N - 2)
    {
        int idx1 = 0, idx2 = 0;
        for(int i = 1; i <= N; i++)
        {
            if(!oznacen[i])
            {
                if(idx1)idx2 = i;
                else idx1 = i;
            }
        }
        bool f1 = 0;
        for(int i = 0; i < V[idx1].size(); i++)if(V[idx1][i] == idx2)f1 = true;
        if(!f1)
        {
            cout << -1 << '\n';
            return;
        }
        vis[idx1] = vis[idx2] = true;

        for(int i = 0; i < D.size(); i++)
        {
            pair<int, int>p = D[i];
            if(p.first == idx1 && p.second == idx2 || p.second == idx1 && p.first == idx2)sol.pb({p.first,p.second});
            if(p.first == idx1 && !vis[p.second])
            {
                sol.pb({p.first,p.second});
                vis[p.second] = true;
            }
            else if(p.second == idx1 && !vis[p.first])
            {
                sol.pb({p.first,p.second});
                vis[p.first] = true;
            }
            else if(p.first == idx2 && !vis[p.second])
            {
                sol.pb({p.first,p.second});
                vis[p.second] = true;
            }
            else if(p.second == idx2 && !vis[p.first])
            {
                sol.pb({p.first,p.second});
                vis[p.first] = true;
            }

        }
        cout << sol.size() << '\n';
        for(int i = 0; i < sol.size(); i++)cout << sol[i].first << ' ' << sol[i].second << '\n';
    }
}
void set4()
{
    for(int i = 1; i <= S; i++)
    {
        if(V[A[i]].size() > 1)
        {
            cout << -1 << '\n';
            return;
        }
    }
    cout << D.size() << '\n';
    for(int i = 0; i < D.size(); i++)cout << D[i].first << ' ' << D[i].second << '\n';

}
inline void sve()
{
//    memset(vis, 0, sizeof(vis));
//    for(int i = 0; i < B.size(); i++)cout << B[i] << ' ';
//    cout << '\n';
//    for(int i = 0; i < B.size(); i++)cout << vis[B[i]] << ' ';
//    cout << '\n';
    vis[B[0]] = 1;
    dfsNeoznaceni(B[0]);
//    for(int i = 0; i < sol.size(); i++)
//    {
//        cout << sol[i].first << ' ' << sol[i].second << '\n';
//    }
//    for(int i = 0; i < B.size(); i++)cout << vis[B[i]] << ' ';
//    cout << '\n';
//    cout << '\n';
    bool flag2 = false;
    for(int i = 0; i < B.size(); i++)
    {
        if(!vis[B[i]])
        {
            cout << -1 << '\n';
            return;
        }
    }


    for(int i = 1; i <= S; i++)
    {

        for(int j = 0; j < V[A[i]].size(); j++)
        {
            int u = V[A[i]][j];
            if(!oznacen[u])
            {
                sol.pb({A[i], u});
                break;
            }
        }
    }
    cout << sol.size() << '\n';
    for(int i = 0; i < sol.size(); i++)
    {
        if(MP[sol[i].first << 34 + sol[i].second])cout << sol[i].first << ' ' << sol[i].second << '\n';
        else cout << sol[i].second << ' ' << sol[i].first << '\n';
    }

}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> T;
    while(T--)
    {
        B.clear();
        sol.clear();
        D.clear();
        MP.clear();
        memset(oznacen, 0, sizeof(oznacen));
        memset(vis, 0, sizeof(vis));
        memset(dis, 0, sizeof(dis));
        for(int i = 1; i <= N; i++)V[i].clear();
        cin >> N >> M >> S;
        for(int i = 1; i <= S; i++)cin>> A[i], oznacen[A[i]] = true;
        for(int i = 1; i <= N; i++)if(!oznacen[i])B.pb(i);
        bool flag1 = false;
        for(int i = 1; i <= M; i++)
        {
            int a, b;
            cin >>a >> b;
            V[a].pb(b);
            V[b].pb(a);
            D.pb({a, b});
            MP[a << 34 + b]++;
            if(oznacen[a] && oznacen[b])flag1 = true;
        }
//        if(flag1)
//        {
//            cout << -1 << '\n';
//            continue;
//        }
        if(S >= N - 2)
        {
            set3();
            continue;
        }
        sve();
        continue;
//        if(M == N - 1)
//        {
//            set4();
//            continue;
//        }

//         if(N <= 10 && M <= 20)
//        {
//            set1();
//            continue;
//        }


    }
    return 0;
}