#include<bits/stdc++.h>
using namespace std;
vector <int> a[1000005];
vector<int> prob;
vector<int> gad;
bool povezani[100005];
bool gadan[100005];
bool poseceni[100005];
int s[100005];

int N, M,n,S,k,T,br;
void MST(int poc){
    for(int i=poc; i<=N;i++){
        if(gadan[i]==false){
            for(int j=0 ; j<=a[i].size()-1;j++)
                if(povezani[a[i][j]]==false and gadan[a[i][j]]==false){
                    povezani[a[i][j]]=true;
                    prob.push_back(i);
                    prob.push_back(a[i][j]);
            }
        }
    }
}
void DFS(int x){
        poseceni[x]=true;
        //cout<<x<<endl;
        for(int i=0;i<=a[x].size()-1;i++){
            if(poseceni[a[x][i]]==false and gadan[a[x][i]]==false){
            poseceni[a[x][i]]=true;
           // cout<<"posecen u dfs: "<<a[x][i]<<endl;
            DFS(a[x][i]);
            }
        }
}
int vezigadove(int n){
    if(M<N-1){
        return 2;
    }
    int provera=1;
    if(n==1){
        for(int i=0;i<gad.size();i++){
            br=0;
            for(int j=0 ; j<a[gad[i]].size();j++){
                if(gadan[a[gad[i]][j]]==false){
                    prob.push_back(gad[i]);
                    prob.push_back(a[gad[i]][j]);
                    j=a[gad[i]].size()+3;
                }else{
                    br++;
                }
                if(br==a[gad[i]].size()){
                    return 2;
                    break;
                }
            }
        }
    }else{
    provera=3;
    }
    return provera;


}
int main (){
    cin>>T;
    while(T--){
    n=0;
    for(int i=1 ; i<=N;i++){
        gadan[i]=false;
        povezani[i]=false;
        poseceni[i]=false;
        a[i].clear();
    }
    cin>>N>>M>>S;
    for(int i=1 ; i<= S;i++){
        cin>>k;
        gad.push_back(k);
        gadan[k]=true;
    }
    for(int i=1 ; i<=M;i++){
        int x, y;
        cin>>x>>y;
        a[x].push_back(y);
        a[y].push_back(x);
    }

    for(int i=1 ; i<=N;i++){
        if(poseceni[i]==false and gadan[i]==false){
            n++;
            DFS(i);
        }
    }
    int i=1;
    while(gadan[i]==true){
        i++;
    }
    povezani[i]=true;

    MST(i);

    int x;
    x=vezigadove(n);
    if(x==2 or x==3){
        cout<<-1<<endl;
    }else{
        cout<<prob.size()/2<<endl;
        for(int i=0 ; i<=prob.size()-1;i+=2){
            cout<<prob[i]<<' '<<prob[i+1]<<endl;
        }
    }
    prob.clear();
    gad.clear();
    }
    return 0;
}