#include <bits/stdc++.h>

#define eps 1e-9

#define pb push_back

#define inf 0x3f3f3f3f

#define mod 1000000007

#define sq(_) ((_)*(_))

#define cb(_) ((_)*(_)*(_))

#define bit(x, y) (((x)>>(y))&1)

#define bctz(x) (__builtin_ctz(x))

#define bclz(x) (__builtin_clz(x))

#define bctzl(x) (__builtin_ctzll(x))

#define bclzl(x) (__builtin_clzll(x))

#define bpt(x) (__builtin_popcount(x))

#define bptl(x) (__builtin_popcountll(x))

#define PQ priority_queue<pii, vector<pii>, greater<pii> >

#define x first

#define y second

#define out(x,y) (x<0||y<0||x>n||y>m)

using namespace std;

typedef double DO;

typedef long long INT;

typedef vector<int> VI;

typedef pair<int, int> pii;

typedef pair<pii, int> pi3;

template<typename T, typename U> inline void smin(T &a, U b) {if (a>b) a=b;}

template<typename T, typename U> inline void smax(T &a, U b) {if (a<b) a=b;}

template<class T> inline void gn(T &x) {char c, sg=0; while (c=getchar(), (c>'9' || c<'0') && c!='-');for((c=='-'?sg=1, c=getchar():0), x=0; c>='0' && c<='9'; c=getchar()) x=(x<<1)+(x<<3)+c-'0';if (sg) x=-x;}

template<class T1, class T2> inline void gn(T1 &x1, T2 &x2) {gn(x1), gn(x2);}

template<class T1, class T2, class T3> inline void gn(T1 &x1, T2 &x2, T3 &x3) {gn(x1), gn(x2), gn(x3);}

template<class T1, class T2, class T3, class T4> inline void gn(T1 &x1, T2 &x2, T3 &x3, T4 &x4) {gn(x1), gn(x2), gn(x3), gn(x4);}

template<class T> inline void print(T x) {if (x<0) {putchar('-');return print(-x);}if (x<10) {putchar('0'+x);return;} print(x/10);putchar(x%10+'0');}

template<class T> inline void printsp(T x) {print(x); putchar(' ');}

template<class T> inline void println(T x) {print(x); putchar('\n');}

template<class T1, class T2> inline void print(T1 x1, T2 x2){printsp(x1), println(x2);}

template<class T1, class T2, class T3> inline void print(T1 x1, T2 x2, T3 x3){printsp(x1), printsp(x2), println(x3);}

template<class T1, class T2, class T3, class T4> inline void print(T1 x1, T2 x2, T3 x3, T4 x4){printsp(x1), printsp(x2), printsp(x3), println(x4);}

int power(int a, int b, int m, int ans=1) {

	for (; b; b>>=1, a=1LL*a*a%m) if (b&1) ans=1LL*ans*a%m;

	return ans;

}

#define NN 111111

#define MM 8010

vector <int> ans,tmp;

bool flag[NN];

int main() {

#ifndef ONLINE_JUDGE

	freopen("in.in", "r", stdin);

	freopen("out.out", "w", stdout);

#endif

    int n,m,k;

    gn(n,m,k);

	if(n==k || m>(n-1)*(n-2)/2+n-k) {puts("-1");return 0;}

	int s;

    for(int i=0;i<k;i++){

    	gn(s);

    	flag[s]=1;

	}

	int a=1; while(flag[a]==0) a++;

	int b=a+1; while(flag[b]==0) b++;

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

		if(!m) return 0;

		if(i!=a && i!=b) {printsp(a),println(i);m--;}

		if(flag[i]==0 && i!=b && i!=a) {printsp(b),println(i);m--;}

	}

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

		if(i==a || i==b) continue;

		for(int j=i+1;j<=n;j++){

			if(j==a || j==b) continue;

			if(!m) return;

			printsp(j),println(i);m--;

		}

	}

	return 0;

}


#include <bits/stdc++.h>

#define eps 1e-9

#define pb push_back

#define inf 0x3f3f3f3f

#define mod 1000000007

#define sq(_) ((_)*(_))

#define cb(_) ((_)*(_)*(_))

#define bit(x, y) (((x)>>(y))&1)

#define bctz(x) (__builtin_ctz(x))

#define bclz(x) (__builtin_clz(x))

#define bctzl(x) (__builtin_ctzll(x))

#define bclzl(x) (__builtin_clzll(x))

#define bpt(x) (__builtin_popcount(x))

#define bptl(x) (__builtin_popcountll(x))

#define PQ priority_queue<pii, vector<pii>, greater<pii> >

#define x first

#define y second

#define out(x,y) (x<0||y<0||x>n||y>m)

using namespace std;

typedef double DO;

typedef long long INT;

typedef vector<int> VI;

typedef pair<int, int> pii;

typedef pair<pii, int> pi3;

template<typename T, typename U> inline void smin(T &a, U b) {if (a>b) a=b;}

template<typename T, typename U> inline void smax(T &a, U b) {if (a<b) a=b;}

template<class T> inline void gn(T &x) {char c, sg=0; while (c=getchar(), (c>'9' || c<'0') && c!='-');for((c=='-'?sg=1, c=getchar():0), x=0; c>='0' && c<='9'; c=getchar()) x=(x<<1)+(x<<3)+c-'0';if (sg) x=-x;}

template<class T1, class T2> inline void gn(T1 &x1, T2 &x2) {gn(x1), gn(x2);}

template<class T1, class T2, class T3> inline void gn(T1 &x1, T2 &x2, T3 &x3) {gn(x1), gn(x2), gn(x3);}

template<class T1, class T2, class T3, class T4> inline void gn(T1 &x1, T2 &x2, T3 &x3, T4 &x4) {gn(x1), gn(x2), gn(x3), gn(x4);}

template<class T> inline void print(T x) {if (x<0) {putchar('-');return print(-x);}if (x<10) {putchar('0'+x);return;} print(x/10);putchar(x%10+'0');}

template<class T> inline void printsp(T x) {print(x); putchar(' ');}

template<class T> inline void println(T x) {print(x); putchar('\n');}

template<class T1, class T2> inline void print(T1 x1, T2 x2){printsp(x1), println(x2);}

template<class T1, class T2, class T3> inline void print(T1 x1, T2 x2, T3 x3){printsp(x1), printsp(x2), println(x3);}

template<class T1, class T2, class T3, class T4> inline void print(T1 x1, T2 x2, T3 x3, T4 x4){printsp(x1), printsp(x2), printsp(x3), println(x4);}

int power(int a, int b, int m, int ans=1) {

	for (; b; b>>=1, a=1LL*a*a%m) if (b&1) ans=1LL*ans*a%m;

	return ans;

}

#define NN 111111

#define MM 8010

vector <int> ans,tmp;

bool flag[NN];

int main() {

#ifndef ONLINE_JUDGE

	freopen("in.in", "r", stdin);

	freopen("out.out", "w", stdout);

#endif

    int n,m,k;

    gn(n,m,k);

	if(n==k || m>(n-1)*(n-2)/2+n-k) {puts("-1");return 0;}

	int s;

    for(int i=0;i<k;i++){

    	gn(s);

    	flag[s]=1;

	}

	int a=1; while(flag[a]==0) a++;

	int b=a+1; while(flag[b]==0) b++;

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

		if(!m) return 0;

		if(i!=a && i!=b) {printsp(a),println(i);m--;}

		if(flag[i]==0 && i!=b && i!=a) {printsp(b),println(i);m--;}

	}

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

		if(i==a || i==b) continue;

		for(int j=i+1;j<=n;j++){

			if(j==a || j==b) continue;

			if(!m) return 0;

			printsp(j),println(i);m--;

		}

	}

	return 0;

}


#include <cstdio>
#include <cstring>
using namespace std;
int n, m, k;
bool p[405];
int main()
{
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 1; i <= n; i++)
        p[i] = false;
    int tmp;
    for (int i = 0; i < k; i++)
    {
        scanf("%d", &tmp);
        p[tmp] = true;
    }
    if (k==n||m>((n-2)*(n-1)/2+n-k))
        printf("-1\n");
    else
    {
        int a1, a2;
        for (int i = 1; i <= n; i++)
        {
            if (p[i])
            {
                a1 = i;
            }
            if (!p[i])
            {
                a2 = i;
            }
        }
        int cnt = 0;
        for (int i = 1; i <= n; i++)
        {
            if (i!=a2)
                printf("%d %d\n", i, a2);
            cnt++;
            if (cnt==m)
                return 0;
        }
        for (int i = 1; i <= n; i++)
        {
            if (i==a1||i==a2)
                continue;
            for (int j = i+1; j <= n; j++)
            {
                if (j==a1||j==a2)
                    continue;
                printf("%d %d\n", i, j);
                cnt++;
                if (cnt==m)
                    return 0;
            }
        }
        for (int i = 1; i <= n; i++)
        {
            if (!p[i]&&i!=a2)
            {
                printf("%d %d\n", i, a1);
            }
            cnt++;
            if (m==cnt)
                return 0;
        }
    }
}


#include <cstdio>
#include <cstring>
using namespace std;
int n, m, k;
bool p[405];
int main()
{
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 1; i <= n; i++)
        p[i] = false;
    int tmp;
    for (int i = 0; i < k; i++)
    {
        scanf("%d", &tmp);
        p[tmp] = true;
    }
    if (k==n||m>(n*(n-1)/2-k+1))
        printf("No\n");
    else
    {
        int a1, a2;
        for (int i = 1; i <= n; i++)
        {
            if (p[i])
            {
                a1 = i;
            }
            if (!p[i])
            {
                a2 = i;
            }
        }
        int cnt = 0;
        for (int i = 1; i <= n; i++)
        {
            if (i!=a2)
                printf("%d %d\n", i, a2);
            cnt++;
        }
        if (cnt==m)
                return 0;
        for (int i = 1; i <= n; i++)
        {
            if (i==a1||i==a2)
                continue;
            for (int j = i+1; j <= n; j++)
            {
                if (j==a1||j==a2)
                    continue;
                printf("%d %d\n", i, j);
                cnt++;
                if (cnt==m)
                    return 0;
            }
        }
        for (int i = 1; i <= n; i++)
        {
            if (!p[i]&&i!=a2)
            {
                printf("%d %d\n", i, a1);
            }
            cnt++;
            if (m==cnt)
                return 0;
        }
    }
}


#include <cstdio>
#include <cstring>
using namespace std;
int n, m, k;
bool p[405];
int main()
{
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 1; i <= n; i++)
        p[i] = false;
    int tmp;
    for (int i = 0; i < k; i++)
    {
        scanf("%d", &tmp);
        p[tmp] = true;
    }
    if (k==n||m>((n-2)*(n-1)/2+n-k))
        printf("No\n");
    else
    {
        int a1, a2;
        for (int i = 1; i <= n; i++)
        {
            if (p[i])
            {
                a1 = i;
            }
            if (!p[i])
            {
                a2 = i;
            }
        }
        int cnt = 0;
        for (int i = 1; i <= n; i++)
        {
            if (i!=a2)
                printf("%d %d\n", i, a2);
            cnt++;
            if (cnt==m)
                return 0;
        }
        for (int i = 1; i <= n; i++)
        {
            if (i==a1||i==a2)
                continue;
            for (int j = i+1; j <= n; j++)
            {
                if (j==a1||j==a2)
                    continue;
                printf("%d %d\n", i, j);
                cnt++;
                if (cnt==m)
                    return 0;
            }
        }
        for (int i = 1; i <= n; i++)
        {
            if (!p[i]&&i!=a2)
            {
                printf("%d %d\n", i, a1);
            }
            cnt++;
            if (m==cnt)
                return 0;
        }
    }
}


#include <cstdio>
#include <cstring>
using namespace std;
int n, m, k;
bool p[405];
int main()
{
    //freopen("in.txt", "r", stdin);
    scanf("%d%d%d", &n, &m, &k);
if (k==n||m>((n-2)*(n-1)/2+n-k)){
        printf("-1\n");
return 0;}
    for (int i = 1; i <= n; i++)
        p[i] = false;
    int tmp;
    for (int i = 0; i < k; i++)
    {
        scanf("%d", &tmp);
        p[tmp] = true;
    }

        int a1, a2;
        for (int i = 1; i <= n; i++)
        {
            if (p[i])
            {
                a1 = i;
            }
            if (!p[i])
            {
                a2 = i;
            }
        }
        int cnt = 0;
        for (int i = 1; i <= n; i++)
        {
            if (i!=a2)
            {
                printf("%d %d\n", i, a2);
                cnt++;
            }

            if (cnt==m)
                return 0;
        }
        for (int i = 1; i <= n; i++)
        {
            if (!p[i]&&i!=a2)
            {
                printf("%d %d\n", i, a1);
                cnt++;
            }

            if (m==cnt)
                return 0;
        }
        for (int i = 1; i <= n; i++)
        {
            if (i==a1||i==a2)
                continue;
            for (int j = i+1; j <= n; j++)
            {
                if (j==a1||j==a2)
                    continue;
                printf("%d %d\n", i, j);
                cnt++;
                if (cnt==m)
                    return 0;
            }
        }

}


#include <cstdio>
#include <cstring>
using namespace std;
int n, m, k;
bool p[405];
int main()
{
    //freopen("in.txt", "r", stdin);
    scanf("%d%d%d", &n, &m, &k);
if (k==n||m>((n-2)*(n-1)/2+n-k)){
        printf("-1\n");
return 0;}
    for (int i = 1; i <= n; i++)
        p[i] = false;
    int tmp;
    for (int i = 0; i < k; i++)
    {
        scanf("%d", &tmp);
        p[tmp] = true;
    }

    else
    {
        int a1, a2;
        for (int i = 1; i <= n; i++)
        {
            if (p[i])
            {
                a1 = i;
            }
            if (!p[i])
            {
                a2 = i;
            }
        }
        int cnt = 0;
        for (int i = 1; i <= n; i++)
        {
            if (i!=a2)
            {
                printf("%d %d\n", i, a2);
                cnt++;
            }

            if (cnt==m)
                return 0;
        }
        for (int i = 1; i <= n; i++)
        {
            if (!p[i]&&i!=a2)
            {
                printf("%d %d\n", i, a1);
                cnt++;
            }

            if (m==cnt)
                return 0;
        }
        for (int i = 1; i <= n; i++)
        {
            if (i==a1||i==a2)
                continue;
            for (int j = i+1; j <= n; j++)
            {
                if (j==a1||j==a2)
                    continue;
                printf("%d %d\n", i, j);
                cnt++;
                if (cnt==m)
                    return 0;
            }
        }

    }
}


#include <cstdio>
#include <cstring>
using namespace std;
int n, m, k;
bool p[405];
int main()
{
    //freopen("in.txt", "r", stdin);
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 1; i <= n; i++)
        p[i] = false;
    int tmp;
    for (int i = 0; i < k; i++)
    {
        scanf("%d", &tmp);
        p[tmp] = true;
    }
    if (k==n||m>((n-2)*(n-1)/2+n-k))
        printf("-1\n");
    else
    {
        int a1, a2;
        for (int i = 1; i <= n; i++)
        {
            if (p[i])
            {
                a1 = i;
            }
            if (!p[i])
            {
                a2 = i;
            }
        }
        int cnt = 0;
        for (int i = 1; i <= n; i++)
        {
            if (i!=a2)
            {
                printf("%d %d\n", i, a2);
                cnt++;
            }

            if (cnt==m)
                return 0;
        }
        for (int i = 1; i <= n; i++)
        {
            if (!p[i]&&i!=a2)
            {
                printf("%d %d\n", i, a1);
                cnt++;
            }

            if (m==cnt)
                return 0;
        }
        for (int i = 1; i <= n; i++)
        {
            if (i==a1||i==a2)
                continue;
            for (int j = i+1; j <= n; j++)
            {
                if (j==a1||j==a2)
                    continue;
                printf("%d %d\n", i, j);
                cnt++;
                if (cnt==m)
                    return 0;
            }
        }

    }
}


#include <cstdio>
#include <cstring>
using namespace std;
int n, m, k;
bool p[405];
int main()
{
    //freopen("in.txt", "r", stdin);
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 1; i <= n; i++)
        p[i] = false;
    int tmp;
    for (int i = 0; i < k; i++)
    {
        scanf("%d", &tmp);
        p[tmp] = true;
    }
    if (k==n||m>((n-2)*(n-1)/2+n-k))
        printf("No\n");
    else
    {
        int a1, a2;
        for (int i = 1; i <= n; i++)
        {
            if (p[i])
            {
                a1 = i;
            }
            if (!p[i])
            {
                a2 = i;
            }
        }
        int cnt = 0;
        for (int i = 1; i <= n; i++)
        {
            if (i!=a2)
            {
                printf("%d %d\n", i, a2);
                cnt++;
            }

            if (cnt==m)
                return 0;
        }
        for (int i = 1; i <= n; i++)
        {
            if (!p[i]&&i!=a2)
            {
                printf("%d %d\n", i, a1);
                cnt++;
            }

            if (m==cnt)
                return 0;
        }
        for (int i = 1; i <= n; i++)
        {
            if (i==a1||i==a2)
                continue;
            for (int j = i+1; j <= n; j++)
            {
                if (j==a1||j==a2)
                    continue;
                printf("%d %d\n", i, j);
                cnt++;
                if (cnt==m)
                    return 0;
            }
        }

    }
}


#include <bits/stdc++.h>

#define sd(x) scanf("%d",&x)
#define sd2(x,y) scanf("%d%d",&x,&y)
#define sd3(x,y,z) scanf("%d%d%d",&x,&y,&z)

#define fi first
#define se second
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define LET(x, a)  __typeof(a) x(a)
#define foreach(it, v) for(LET(it, v.begin()); it != v.end(); it++)

#define _ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define __ freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);

#define meta __FUNCTION__<<' '<<__LINE__<<' '
#define tr(x) cout<<meta<<#x<<' '<<x<<'\n';
#define tr2(x,y) cout<<meta<<#x<<' '<<x<<' '<<#y<<' '<<y<<'\n';
#define tr3(x,y,z) cout<<meta<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr4(w,x,y,z) cout<<meta<<#w<<' '<<w<<' '<<#x<<' ' <<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr5(v,w,x,y,z) cout<<meta<<#v<<' '<<v<<' '<<#w<<' '<<w<<' '<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr6(u,v,w,x,y,z) cout<<meta<<#u<<' '<<u<<' '<<#v<<' '<<v<<' '<<#w<<' '<<w<<' '<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';

using namespace std;

template<typename S, typename T>
ostream& operator<<(ostream& out, pair<S, T> const& p){out<<'('<<p.first<<", "<<p.second<<')'; return out;}

template<typename T>
ostream& operator<<(ostream& out, vector<T> const & v){
int l = v.size(); for(int i = 0; i < l-1; i++) out<<v[i]<<' '; if(l>0) out<<v[l-1]; return out;}

const int N = 310;

set<pair<int,int> > e;
set<int> v;

int n, m, k;
int a[N];

int bad[N];

int main(){
	sd3(n,m,k);

	if(2*m == n*(n-1) or m == 1){
		puts("-1");
		return 0;
	}

	for(int i = 0; i < n; i++){
		v.insert(i+1);
	}

	for(int i = 0; i < k; i++){
		sd(a[i]);
		v.erase(a[i]);
	}

	int x = *v.begin();
	if(x == 1){
		e.insert(mp(1,2));
		e.insert(mp(1,3));
		bad[2] = 1;
		bad[3] = 1;
	}
	else if(x == n){
		e.insert(mp(n,n-1));
		e.insert(mp(n,n-2));
		bad[n-1] = 1;
		bad[n-2] = 1;
	}
	else{
		e.insert(mp(x,x+1));
		e.insert(mp(x,x-1));
		bad[x+1] = 1;
		bad[x-1] = 1;
	}

	m -= 2;

	for(int i = 1; i <= n and m > 0; i++){
		for(int j = 1; j <= n and m > 0; j++){
			if(i == j) continue;
			if(e.count(mp(i,j)) or e.count(mp(j,i))) continue;
			if(bad[i] and bad[j]) continue;
			e.insert(mp(i,j));
			m--;
		}
	}

	foreach(it, e){
		printf("%d %d\n", it->fi, it->se);
	}

	return 0;
}


#include <bits/stdc++.h>

#define sd(x) scanf("%d",&x)
#define sd2(x,y) scanf("%d%d",&x,&y)
#define sd3(x,y,z) scanf("%d%d%d",&x,&y,&z)

#define fi first
#define se second
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define LET(x, a)  __typeof(a) x(a)
#define foreach(it, v) for(LET(it, v.begin()); it != v.end(); it++)

#define _ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define __ freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);

#define meta __FUNCTION__<<' '<<__LINE__<<' '
#define tr(x) cout<<meta<<#x<<' '<<x<<'\n';
#define tr2(x,y) cout<<meta<<#x<<' '<<x<<' '<<#y<<' '<<y<<'\n';
#define tr3(x,y,z) cout<<meta<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr4(w,x,y,z) cout<<meta<<#w<<' '<<w<<' '<<#x<<' ' <<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr5(v,w,x,y,z) cout<<meta<<#v<<' '<<v<<' '<<#w<<' '<<w<<' '<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr6(u,v,w,x,y,z) cout<<meta<<#u<<' '<<u<<' '<<#v<<' '<<v<<' '<<#w<<' '<<w<<' '<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';

using namespace std;

template<typename S, typename T>
ostream& operator<<(ostream& out, pair<S, T> const& p){out<<'('<<p.first<<", "<<p.second<<')'; return out;}

template<typename T>
ostream& operator<<(ostream& out, vector<T> const & v){
int l = v.size(); for(int i = 0; i < l-1; i++) out<<v[i]<<' '; if(l>0) out<<v[l-1]; return out;}

const int N = 310;

int n, m, k;
int a[N], bad[N];
vector<pair<int,int> > e;

int main(){
	sd3(n,m,k);
	if(k == n){
		puts("-1");
		return 0;
	}

	for(int i = 1; i <= k; i++){
		sd(a[i]);
		bad[a[i]] = 1;
	}

	vector<int> v;
	for(int i = 1; i <= n; i++) if(!bad[i]) v.pb(i);

	int r = v.size();
	for(int i = 1; i <= n; i++) if(bad[i]) v.pb(i);

	swap(v[0], v[r]);

	// add all except k-1 edges
	// make the graph connected, this is the first priority
	for(int i = 0; i < n-1; i++) e.pb(mp(v[i], v[i+1]));

	// make the subgraph G - v[0] complete
	for(int i = 1; i < n; i++) for(int j = i+2; j < n; j++) e.pb(mp(v[i],v[j]));

	// only add those edges from v[0] such that there are no marked vertices
	// on the path between v[0] and any other marked vertex
	for(int i = 2; i <= r; i++) e.pb(mp(v[0], v[i]));

	if(e.size() < m){
		puts("-1");
		return 0;
	}

	// print the first m edges to ensure the graph is connected
	// if we can still print edges, we print those that do no affect the result
	// i.e. distance between v[0] and any other marked vertex is always >= 2 but Valera cannot compute it
	for(int i = 0; i < m; i++) printf("%d %d\n", e[i].fi, e[i].se);

	return 0;
}


#include <bits/stdc++.h>

#define sd(x) scanf("%d",&x)
#define sd2(x,y) scanf("%d%d",&x,&y)
#define sd3(x,y,z) scanf("%d%d%d",&x,&y,&z)

#define fi first
#define se second
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define LET(x, a)  __typeof(a) x(a)
#define foreach(it, v) for(LET(it, v.begin()); it != v.end(); it++)

#define _ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define __ freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);

#define meta __FUNCTION__<<' '<<__LINE__<<' '
#define tr(x) cout<<meta<<#x<<' '<<x<<'\n';
#define tr2(x,y) cout<<meta<<#x<<' '<<x<<' '<<#y<<' '<<y<<'\n';
#define tr3(x,y,z) cout<<meta<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr4(w,x,y,z) cout<<meta<<#w<<' '<<w<<' '<<#x<<' ' <<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr5(v,w,x,y,z) cout<<meta<<#v<<' '<<v<<' '<<#w<<' '<<w<<' '<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr6(u,v,w,x,y,z) cout<<meta<<#u<<' '<<u<<' '<<#v<<' '<<v<<' '<<#w<<' '<<w<<' '<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';

using namespace std;

template<typename S, typename T>
ostream& operator<<(ostream& out, pair<S, T> const& p){out<<'('<<p.first<<", "<<p.second<<')'; return out;}

template<typename T>
ostream& operator<<(ostream& out, vector<T> const & v){
int l = v.size(); for(int i = 0; i < l-1; i++) out<<v[i]<<' '; if(l>0) out<<v[l-1]; return out;}

const int N = 310;

set<pair<int,int> > e;
set<int> v;

int n, m, k;
int a[N];

int main(){
	sd3(n,m,k);

	if(2*m == n*(n-1) or m == 1){
		puts("-1");
		return 0;
	}

	for(int i = 0; i < n; i++){
		v.insert(i+1);
	}

	for(int i = 0; i < k; i++){
		sd(a[i]);
		v.erase(a[i]);
	}

	int x = *v.begin();
	if(x == 1){
		e.insert(mp(1,2));
		e.insert(mp(1,3));
	}
	else if(x == n){
		e.insert(mp(n,n-1));
		e.insert(mp(n,n-2));
	}
	else{
		e.insert(mp(x,x+1));
		e.insert(mp(x,x-1));
	}

	m -= 2;

	for(int i = 1; i <= n and m > 0; i++){
		for(int j = 1; j <= n and m > 0; j++){
			if(i == j) continue;
			if(e.count(mp(i,j)) or e.count(mp(j,i))) continue;
			e.insert(mp(i,j));
			m--;
		}
	}

	foreach(it, e){
		printf("%d %d\n", it->fi, it->se);
	}

	return 0;
}


#include <bits/stdc++.h>

#define sd(x) scanf("%d",&x)
#define sd2(x,y) scanf("%d%d",&x,&y)
#define sd3(x,y,z) scanf("%d%d%d",&x,&y,&z)

#define fi first
#define se second
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define LET(x, a)  __typeof(a) x(a)
#define foreach(it, v) for(LET(it, v.begin()); it != v.end(); it++)

#define _ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define __ freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);

#define meta __FUNCTION__<<' '<<__LINE__<<' '
#define tr(x) cout<<meta<<#x<<' '<<x<<'\n';
#define tr2(x,y) cout<<meta<<#x<<' '<<x<<' '<<#y<<' '<<y<<'\n';
#define tr3(x,y,z) cout<<meta<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr4(w,x,y,z) cout<<meta<<#w<<' '<<w<<' '<<#x<<' ' <<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr5(v,w,x,y,z) cout<<meta<<#v<<' '<<v<<' '<<#w<<' '<<w<<' '<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr6(u,v,w,x,y,z) cout<<meta<<#u<<' '<<u<<' '<<#v<<' '<<v<<' '<<#w<<' '<<w<<' '<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';

using namespace std;

template<typename S, typename T>
ostream& operator<<(ostream& out, pair<S, T> const& p){out<<'('<<p.first<<", "<<p.second<<')'; return out;}

template<typename T>
ostream& operator<<(ostream& out, vector<T> const & v){
int l = v.size(); for(int i = 0; i < l-1; i++) out<<v[i]<<' '; if(l>0) out<<v[l-1]; return out;}

const int N = 310;

set<pair<int,int> > e;
set<int> v;

int n, m, k;
int a[N];
int bad[N];

int main(){
	sd3(n,m,k);
	int o = m;
	if(m == 1 or k == n){
		puts("-1");
		return 0;
	}

	for(int i = 0; i < n; i++){
		v.insert(i+1);
	}

	for(int i = 0; i < k; i++){
		sd(a[i]);
		v.erase(a[i]);
		bad[a[i]] = 1;
	}

	if(m == ((n*(n-1))/2) - 1){
		if(k == 2){
			for(int i = 1; i <= n; i++){
				for(int j = i+1; j <= n; j++){
					if((i == a[0] or i == a[1]) and (j == a[0] or j == a[1])) continue;
					printf("%d %d\n", i, j);
				}
			}
		}
		return 0;
	}

	int x = *v.begin();
	int u[2];
	for(int i = 1, j = 2; i <= n and j > 0; i++){
		if(x != i){
			j--;
			e.insert(mp(x,i));
			u[j] = i;
		}
	}

	m -= 2;

	for(int i = 1; i <= n and m > 0; i++){
		for(int j = 1; j <= n and m > 0; j++){
			if(i == j) continue;
			if(e.count(mp(i,j)) or e.count(mp(j,i))) continue;
			if((i == u[0] or i == u[1]) and (j == u[0] or j == u[1])) continue;
			if(i == u[0] and bad[j]) continue;
			if(j == u[0] and bad[i]) continue;
			e.insert(mp(i,j));
			m--;
		}
	}

	if(e.size() != o){
		puts("-1"); return 0;
	}

	foreach(it, e){
		printf("%d %d\n", it->fi, it->se);
	}

	return 0;
}


#include <bits/stdc++.h>

#define sd(x) scanf("%d",&x)
#define sd2(x,y) scanf("%d%d",&x,&y)
#define sd3(x,y,z) scanf("%d%d%d",&x,&y,&z)

#define fi first
#define se second
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define LET(x, a)  __typeof(a) x(a)
#define foreach(it, v) for(LET(it, v.begin()); it != v.end(); it++)

#define _ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define __ freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);

#define meta __FUNCTION__<<' '<<__LINE__<<' '
#define tr(x) cout<<meta<<#x<<' '<<x<<'\n';
#define tr2(x,y) cout<<meta<<#x<<' '<<x<<' '<<#y<<' '<<y<<'\n';
#define tr3(x,y,z) cout<<meta<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr4(w,x,y,z) cout<<meta<<#w<<' '<<w<<' '<<#x<<' ' <<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr5(v,w,x,y,z) cout<<meta<<#v<<' '<<v<<' '<<#w<<' '<<w<<' '<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr6(u,v,w,x,y,z) cout<<meta<<#u<<' '<<u<<' '<<#v<<' '<<v<<' '<<#w<<' '<<w<<' '<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';

using namespace std;

template<typename S, typename T>
ostream& operator<<(ostream& out, pair<S, T> const& p){out<<'('<<p.first<<", "<<p.second<<')'; return out;}

template<typename T>
ostream& operator<<(ostream& out, vector<T> const & v){
int l = v.size(); for(int i = 0; i < l-1; i++) out<<v[i]<<' '; if(l>0) out<<v[l-1]; return out;}

const int N = 310;

set<pair<int,int> > e;
set<int> v;

int n, m, k;
int a[N];
int bad[N];

int main(){
	sd3(n,m,k);
	int o = m;
	if(m == 1 or k == n){
		puts("-1");
		return 0;
	}

	for(int i = 0; i < n; i++){
		v.insert(i+1);
	}

	for(int i = 0; i < k; i++){
		sd(a[i]);
		v.erase(a[i]);
		bad[a[i]] = 1;
	}

	if(m == ((n*(n-1))/2) - 1){
		if(k == 2){
			for(int i = 1; i <= n; i++){
				for(int j = i+1; j <= n; j++){
					if((i == a[0] or i == a[1]) and (j == a[0] or j == a[1])) continue;
					printf("%d %d\n", i, j);
				}
			}
		}
		return 0;
	}

	int x = *v.begin();
	int u[2];
	for(int i = 1, j = 2; i <= n and j > 0; i++){
		if(x != i){
			j--;
			e.insert(mp(x,i));
			u[j] = i;
		}
	}

	m -= 2;

	for(int i = 1; i <= n and m > 0; i++){
		for(int j = 1; j <= n and m > 0; j++){
			if(i == j) continue;
			if(e.count(mp(i,j)) or e.count(mp(j,i))) continue;
			if((i == u[0] or i == u[1]) and (j == u[0] or j == u[1])) continue;
			if((i == u[0] or i == u[1]) and bad[j]) continue;
			if((j == u[0] or j == u[1]) and bad[i]) continue;
			e.insert(mp(i,j));
			m--;
		}
	}

	if(e.size() != o){
		puts("-1"); return 0;
	}

	foreach(it, e){
		printf("%d %d\n", it->fi, it->se);
	}

	return 0;
}


#include <bits/stdc++.h>

#define sd(x) scanf("%d",&x)
#define sd2(x,y) scanf("%d%d",&x,&y)
#define sd3(x,y,z) scanf("%d%d%d",&x,&y,&z)

#define fi first
#define se second
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define LET(x, a)  __typeof(a) x(a)
#define foreach(it, v) for(LET(it, v.begin()); it != v.end(); it++)

#define _ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define __ freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);

#define meta __FUNCTION__<<' '<<__LINE__<<' '
#define tr(x) cout<<meta<<#x<<' '<<x<<'\n';
#define tr2(x,y) cout<<meta<<#x<<' '<<x<<' '<<#y<<' '<<y<<'\n';
#define tr3(x,y,z) cout<<meta<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr4(w,x,y,z) cout<<meta<<#w<<' '<<w<<' '<<#x<<' ' <<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr5(v,w,x,y,z) cout<<meta<<#v<<' '<<v<<' '<<#w<<' '<<w<<' '<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr6(u,v,w,x,y,z) cout<<meta<<#u<<' '<<u<<' '<<#v<<' '<<v<<' '<<#w<<' '<<w<<' '<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';

using namespace std;

template<typename S, typename T>
ostream& operator<<(ostream& out, pair<S, T> const& p){out<<'('<<p.first<<", "<<p.second<<')'; return out;}

template<typename T>
ostream& operator<<(ostream& out, vector<T> const & v){
int l = v.size(); for(int i = 0; i < l-1; i++) out<<v[i]<<' '; if(l>0) out<<v[l-1]; return out;}

const int N = 310;

set<pair<int,int> > e;
set<int> v;

int n, m, k;
int a[N];
int bad[N];

int main(){
	sd3(n,m,k);
	int o = m;
	if(m == 1){
		puts("-1");
		return 0;
	}

	for(int i = 0; i < n; i++){
		v.insert(i+1);
	}

	for(int i = 0; i < k; i++){
		sd(a[i]);
		v.erase(a[i]);
		bad[a[i]] = 1;
	}

	if(m == ((n*(n-1))/2) - 1){
		if(k == 2){
			for(int i = 1; i <= n; i++){
				for(int j = i+1; j <= n; j++){
					if((i == a[0] or i == a[1]) and (j == a[0] or j == a[1])) continue;
					printf("%d %d\n", i, j);
				}
			}
		}
		return 0;
	}

	int x = *v.begin();
	int u[2];
	for(int i = 1, j = 2; i <= n and j > 0; i++){
		if(x != i){
			j--;
			e.insert(mp(x,i));
			u[j] = i;
		}
	}

	m -= 2;

	for(int i = 1; i <= n and m > 0; i++){
		for(int j = 1; j <= n and m > 0; j++){
			if(i == j) continue;
			if(e.count(mp(i,j)) or e.count(mp(j,i))) continue;
			if((i == u[0] or i == u[1]) and (j == u[0] or j == u[1])) continue;
			if((i == u[0] or i == u[1]) and bad[j]) continue;
			if((j == u[0] or j == u[1]) and bad[i]) continue;
			e.insert(mp(i,j));
			m--;
		}
	}

	if(e.size() != o){
		puts("-1"); return 0;
	}

	foreach(it, e){
		printf("%d %d\n", it->fi, it->se);
	}

	return 0;
}


#include <bits/stdc++.h>

#define sd(x) scanf("%d",&x)
#define sd2(x,y) scanf("%d%d",&x,&y)
#define sd3(x,y,z) scanf("%d%d%d",&x,&y,&z)

#define fi first
#define se second
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define LET(x, a)  __typeof(a) x(a)
#define foreach(it, v) for(LET(it, v.begin()); it != v.end(); it++)

#define _ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define __ freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);

#define meta __FUNCTION__<<' '<<__LINE__<<' '
#define tr(x) cout<<meta<<#x<<' '<<x<<'\n';
#define tr2(x,y) cout<<meta<<#x<<' '<<x<<' '<<#y<<' '<<y<<'\n';
#define tr3(x,y,z) cout<<meta<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr4(w,x,y,z) cout<<meta<<#w<<' '<<w<<' '<<#x<<' ' <<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr5(v,w,x,y,z) cout<<meta<<#v<<' '<<v<<' '<<#w<<' '<<w<<' '<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';
#define tr6(u,v,w,x,y,z) cout<<meta<<#u<<' '<<u<<' '<<#v<<' '<<v<<' '<<#w<<' '<<w<<' '<<#x<<' '<<x<<' '<<#y<<' '<<y<<' '<<#z<<' '<<z<<'\n';

using namespace std;

template<typename S, typename T>
ostream& operator<<(ostream& out, pair<S, T> const& p){out<<'('<<p.first<<", "<<p.second<<')'; return out;}

template<typename T>
ostream& operator<<(ostream& out, vector<T> const & v){
int l = v.size(); for(int i = 0; i < l-1; i++) out<<v[i]<<' '; if(l>0) out<<v[l-1]; return out;}

const int N = 310;

set<pair<int,int> > e;
set<int> v;

int n, m, k;
int a[N];
int bad[N];

int main(){
	sd3(n,m,k);
	int o = m;
	if(m == 1){
		puts("-1");
		return 0;
	}

	for(int i = 0; i < n; i++){
		v.insert(i+1);
	}

	for(int i = 0; i < k; i++){
		sd(a[i]);
		v.erase(a[i]);
		bad[a[i]] = 1;
	}

	int x = *v.begin();
	int u[2];
	for(int i = 1, j = 2; i <= n and j > 0; i++){
		if(x != i){
			j--;
			e.insert(mp(x,i));
			u[j] = i;
		}
	}

	m -= 2;

	for(int i = 1; i <= n and m > 0; i++){
		for(int j = 1; j <= n and m > 0; j++){
			if(i == j) continue;
			if(e.count(mp(i,j)) or e.count(mp(j,i))) continue;
			if((i == u[0] or i == u[1]) and (j == u[0] or j == u[1])) continue;
			if((i == u[0] or i == u[1]) and bad[j]) continue;
			if((j == u[0] or j == u[1]) and bad[i]) continue;
			e.insert(mp(i,j));
			m--;
		}
	}

	if(e.size() != o){
		puts("-1"); return 0;
	}

	foreach(it, e){
		printf("%d %d\n", it->fi, it->se);
	}

	return 0;
}


/*===============*\
|  ID: TMANDZU    |
|    LANG: C++    |
\*===============*/
//Tornike Mandzulashvili
//#pragma comment(linker,"/STACK:256000000")
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <stack>
#include <math.h>
#include <vector>
#include <string>
#include <map>
#include <queue>
#include <iostream>
#include <set>
#include <cstring>

#define EPS 0.000000001
#define Pi 3.1415926535897932384626433832795028841971
#define hash1 1000003
#define hash2 1000033
#define md 1000000007
#define INF 1000000500
#define mp make_pair
#define pb push_back
#define S size()
#define MX(aa,bb) (aa>bb?aa:bb)
#define MN(aa,bb) (aa<bb?aa:bb)
#define fi first
#define se second
#define PI pair < int,int >
#define REP(i,a,n) for(i=a;i<n;i++)
#define sc scanf
#define pt printf
#define big long long
#define VI vector <int>
#define DID (long long)
#define ll long long
#define AL(a) (a).begin(),(a).end()

using namespace std;

int i,n,m,k;
int a[1000];
int fix[400],kix[400],g[400][400];
int last,j,u,v;

main()
{
    #ifndef ONLINE_JUDGE
            freopen("text.in","r",stdin); freopen("text.out","w",stdout);
    #endif

    cin>>n>>m>>k;
    for (i=1;i<=k;i++)
    cin>>a[i] , fix[a[i]]=1;

    if (k==n)
    {
        cout<<-1<<endl;
        return 0;
    }

    for (i=1;i<=n;i++)
    if (!fix[i]) v=i;

    if (m>1+(n-1)*(n-2)/2 && k==n-1)
    {
        cout<<-1<<endl;
        return 0;
    }

    u=a[1];
    g[u][v]=1;
    g[v][u]=1;

    m--;

    kix[u]=1;
    kix[v]=1;

    last=v;

    for (i=1;i<=n;i++)
    if (!kix[i])
    {
        g[i][last]=1;
        g[last][i]=1;

        last=i;
        m--;
    }

    for (i=1;i<=n;i++)
    for (j=1;j<=n;j++)
    if (m)
    if (i!=u && j!=u)
    {
        if (!g[i][j])
        {
            g[i][j]=1;
            g[j][i]=1;m--;
        }
    }

    for (i=1;i<=n;i++)
        for (j=i+1;j<=n;j++)
        if (g[i][j]) cout<<i<<" "<<j<<endl;

}


/*===============*\
|  ID: TMANDZU    |
|    LANG: C++    |
\*===============*/
//Tornike Mandzulashvili
//#pragma comment(linker,"/STACK:256000000")
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <stack>
#include <math.h>
#include <vector>
#include <string>
#include <map>
#include <queue>
#include <iostream>
#include <set>
#include <cstring>

#define EPS 0.000000001
#define Pi 3.1415926535897932384626433832795028841971
#define hash1 1000003
#define hash2 1000033
#define md 1000000007
#define INF 1000000500
#define mp make_pair
#define pb push_back
#define S size()
#define MX(aa,bb) (aa>bb?aa:bb)
#define MN(aa,bb) (aa<bb?aa:bb)
#define fi first
#define se second
#define PI pair < int,int >
#define REP(i,a,n) for(i=a;i<n;i++)
#define sc scanf
#define pt printf
#define big long long
#define VI vector <int>
#define DID (long long)
#define ll long long
#define AL(a) (a).begin(),(a).end()

using namespace std;

int h,i,n,m,k;
int a[1000];
int fix[400],kix[400],g[400][400];
int last,j,u,v;

main()
{
    #ifndef ONLINE_JUDGE
            freopen("text.in","r",stdin); freopen("text.out","w",stdout);
    #endif

    cin>>n>>m>>k;
    for (i=1;i<=k;i++)
    cin>>a[i] , fix[a[i]]=1;

    if (k==n)
    {
        cout<<-1<<endl;
        return 0;
    }

    for (i=1;i<=n;i++)
    if (!fix[i]) v=i;

    if (m>2+(n-3)*(n-2)/2)
    {
        cout<<-1<<endl;
        return 0;
    }

    u=a[1];
    g[u][v]=1;
    g[v][u]=1;
    m--;

    h=a[2];
    g[h][v]=1;
    g[v][h]=1;
    m--;

    kix[u]=1;
    kix[v]=1;
    kix[h]=1;

    last=v;

    for (i=1;i<=n;i++)
    if (!kix[i])
    {
        g[i][last]=1;
        g[last][i]=1;
        kix[i]=1;

        last=i;
        m--;
    }

    for (i=1;i<=n;i++)
    for (j=1;j<=n;j++)
    if (m)
    if (i!=u && j!=u && j!=h && i!=h)
    {
        if (!g[i][j])
        {
            g[i][j]=1;
            g[j][i]=1;
            m--;
        }
    }

    for (i=1;i<=n;i++)
    for (j=i+1;j<=n;j++)
    if (g[i][j]) cout<<i<<" "<<j<<endl;

}


/*===============*\
|  ID: TMANDZU    |
|    LANG: C++    |
\*===============*/
//Tornike Mandzulashvili
//#pragma comment(linker,"/STACK:256000000")
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <stack>
#include <math.h>
#include <vector>
#include <string>
#include <map>
#include <queue>
#include <iostream>
#include <set>
#include <cstring>

#define EPS 0.000000001
#define Pi 3.1415926535897932384626433832795028841971
#define hash1 1000003
#define hash2 1000033
#define md 1000000007
#define INF 1000000500
#define mp make_pair
#define pb push_back
#define S size()
#define MX(aa,bb) (aa>bb?aa:bb)
#define MN(aa,bb) (aa<bb?aa:bb)
#define fi first
#define se second
#define PI pair < int,int >
#define REP(i,a,n) for(i=a;i<n;i++)
#define sc scanf
#define pt printf
#define big long long
#define VI vector <int>
#define DID (long long)
#define ll long long
#define AL(a) (a).begin(),(a).end()

using namespace std;

int i,n,m,k;
int a[1000];
int fix[400],kix[400],g[400][400];
int last,j,u,v;

main()
{
    #ifndef ONLINE_JUDGE
            freopen("text.in","r",stdin); freopen("text.out","w",stdout);
    #endif

    cin>>n>>m>>k;
    for (i=1;i<=k;i++)
    cin>>a[i] , fix[a[i]]=1;

    if (k==n)
    {
        cout<<-1<<endl;
        return 0;
    }

    for (i=1;i<=n;i++)
    if (!fix[i]) v=i;

    if (m>1+(n-1)*(n-2)/2+n-k-1)
    {
        cout<<-1<<endl;
        return 0;
    }

    u=a[1];
    g[u][v]=1;
    g[v][u]=1;

    m--;

    kix[u]=1;
    kix[v]=1;

    last=v;

    for (i=1;i<=n;i++)
    if (!kix[i])
    {
        g[i][last]=1;
        g[last][i]=1;

        last=i;
        m--;
    }

    for (i=1;i<=n;i++)
    if (m)
    if (!fix[i] && i!=v && i!=u)
    {
        g[i][u]=1;
        g[u][i]=1;
        m--;
    }

    for (i=1;i<=n;i++)
    for (j=1;j<=n;j++)
    if (m)
    if (i!=u && j!=u)
    {
        if (!g[i][j])
        {
            g[i][j]=1;
            g[j][i]=1;m--;
        }
    }

    for (i=1;i<=n;i++)
    for (j=i+1;j<=n;j++)
    if (g[i][j]) cout<<i<<" "<<j<<endl;

}


/*===============*\
|  ID: TMANDZU    |
|    LANG: C++    |
\*===============*/
//Tornike Mandzulashvili
//#pragma comment(linker,"/STACK:256000000")
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <stack>
#include <math.h>
#include <vector>
#include <string>
#include <map>
#include <queue>
#include <iostream>
#include <set>
#include <cstring>

#define EPS 0.000000001
#define Pi 3.1415926535897932384626433832795028841971
#define hash1 1000003
#define hash2 1000033
#define md 1000000007
#define INF 1000000500
#define mp make_pair
#define pb push_back
#define S size()
#define MX(aa,bb) (aa>bb?aa:bb)
#define MN(aa,bb) (aa<bb?aa:bb)
#define fi first
#define se second
#define PI pair < int,int >
#define REP(i,a,n) for(i=a;i<n;i++)
#define sc scanf
#define pt printf
#define big long long
#define VI vector <int>
#define DID (long long)
#define ll long long
#define AL(a) (a).begin(),(a).end()

using namespace std;

int i,n,m,k;
int a[1000];
int fix[400],kix[400],g[400][400];
int last,j,u,v;

main()
{
    #ifndef ONLINE_JUDGE
            freopen("text.in","r",stdin); freopen("text.out","w",stdout);
    #endif

    cin>>n>>m>>k;
    for (i=1;i<=k;i++)
    cin>>a[i] , fix[a[i]]=1;

    if (k==n)
    {
        cout<<-1<<endl;
        return 0;
    }

    for (i=1;i<=n;i++)
    if (!fix[i]) v=i;

    if (m>1+(n-1)*n/2+n-k-1)
    {
        cout<<-1<<endl;
        return 0;
    }

    u=a[1];
    g[u][v]=1;
    g[v][u]=1;

    m--;

    kix[u]=1;
    kix[v]=1;

    last=v;

    for (i=1;i<=n;i++)
    if (!kix[i])
    {
        g[i][last]=1;
        g[last][i]=1;

        last=i;
        m--;
    }

    for (i=1;i<=n;i++)
    if (m)
    if (!fix[i] && i!=v && i!=u)
    {
        g[i][u]=1;
        g[u][i]=1;
        m--;
    }

    for (i=1;i<=n;i++)
    for (j=1;j<=n;j++)
    if (m)
    if (i!=u && j!=u)
    {
        if (!g[i][j])
        {
            g[i][j]=1;
            g[j][i]=1;m--;
        }
    }

    for (i=1;i<=n;i++)
    for (j=i+1;j<=n;j++)
    if (g[i][j]) cout<<i<<" "<<j<<endl;

}


/*===============*\
|  ID: TMANDZU    |
|    LANG: C++    |
\*===============*/
//Tornike Mandzulashvili
//#pragma comment(linker,"/STACK:256000000")
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <stack>
#include <math.h>
#include <vector>
#include <string>
#include <map>
#include <queue>
#include <iostream>
#include <set>
#include <cstring>

#define EPS 0.000000001
#define Pi 3.1415926535897932384626433832795028841971
#define hash1 1000003
#define hash2 1000033
#define md 1000000007
#define INF 1000000500
#define mp make_pair
#define pb push_back
#define S size()
#define MX(aa,bb) (aa>bb?aa:bb)
#define MN(aa,bb) (aa<bb?aa:bb)
#define fi first
#define se second
#define PI pair < int,int >
#define REP(i,a,n) for(i=a;i<n;i++)
#define sc scanf
#define pt printf
#define big long long
#define VI vector <int>
#define DID (long long)
#define ll long long
#define AL(a) (a).begin(),(a).end()

using namespace std;

int i,n,m,k;
int a[1000];
int fix[400],kix[400],g[400][400];
int last,j,u,v;

main()
{
    #ifndef ONLINE_JUDGE
            freopen("text.in","r",stdin); freopen("text.out","w",stdout);
    #endif

    cin>>n>>m>>k;
    for (i=1;i<=k;i++)
    cin>>a[i] , fix[a[i]]=1;

    if (k==n)
    {
        cout<<-1<<endl;
        return 0;
    }

    for (i=1;i<=n;i++)
    if (!fix[i]) v=i;

    if (m>1+(n-1)*(n-2)/2+n-k-1)
    {
        cout<<-1<<endl;
        return 0;
    }

    u=a[1];
    g[u][v]=1;
    g[v][u]=1;

    m--;

    kix[u]=1;
    kix[v]=1;

    last=v;

    for (i=1;i<=n;i++)
    if (!kix[i])
    {
        g[i][last]=1;
        g[last][i]=1;

        last=i;
        m--;
    }

 //   cout<<m<<endl;

    for (i=1;i<=n;i++)
    if (m)
    if (!fix[i] && i!=v && i!=u)
    {
        g[i][u]=1;
        g[u][i]=1;
        m--;
    }

  //  cout<<m<<endl;

    for (i=1;i<=n;i++)
    for (j=1;j<=n;j++)
    if (m)
    if (i!=u && j!=u && i!=j)
    {
        if (!g[i][j])
        {
            g[i][j]=1;
            g[j][i]=1;
            m--;
        }
    }

    for (i=1;i<=n;i++)
    for (j=i+1;j<=n;j++)
    if (g[i][j]) cout<<i<<" "<<j<<endl;

}


/*===============*\
|  ID: TMANDZU    |
|    LANG: C++    |
\*===============*/
//Tornike Mandzulashvili
//#pragma comment(linker,"/STACK:256000000")
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <stack>
#include <math.h>
#include <vector>
#include <string>
#include <map>
#include <queue>
#include <iostream>
#include <set>
#include <cstring>

#define EPS 0.000000001
#define Pi 3.1415926535897932384626433832795028841971
#define hash1 1000003
#define hash2 1000033
#define md 1000000007
#define INF 1000000500
#define mp make_pair
#define pb push_back
#define S size()
#define MX(aa,bb) (aa>bb?aa:bb)
#define MN(aa,bb) (aa<bb?aa:bb)
#define fi first
#define se second
#define PI pair < int,int >
#define REP(i,a,n) for(i=a;i<n;i++)
#define sc scanf
#define pt printf
#define big long long
#define VI vector <int>
#define DID (long long)
#define ll long long
#define AL(a) (a).begin(),(a).end()

using namespace std;

int i,n,m,k;
int a[1000];
int fix[400],kix[400],g[400][400];
int last,j,u,v;

main()
{
    #ifndef ONLINE_JUDGE
            freopen("text.in","r",stdin); freopen("text.out","w",stdout);
    #endif

    cin>>n>>m>>k;
    for (i=1;i<=k;i++)
    cin>>a[i] , fix[a[i]]=1;

    if (k==n)
    {
        cout<<-1<<endl;
        return 0;
    }

    for (i=1;i<=n;i++)
    if (!fix[i]) v=i;

    if (m>1+(n-1)*(n-2)/2)
    {
        cout<<-1<<endl;
        return 0;
    }

    u=a[1];
    g[u][v]=1;
    g[v][u]=1;

    m--;

    kix[u]=1;
    kix[v]=1;

    last=v;

    for (i=1;i<=n;i++)
    if (!kix[i])
    {
        g[i][last]=1;
        g[last][i]=1;

        last=i;
        m--;
    }

    for (i=1;i<=n;i++)
    for (j=1;j<=n;j++)
    if (m)
    if (i!=u && j!=u)
    {
        if (!g[i][j])
        {
            g[i][j]=1;
            g[j][i]=1;m--;
        }
    }

    for (i=1;i<=n;i++)
        for (j=i+1;j<=n;j++)
        if (g[i][j]) cout<<i<<" "<<j<<endl;

}


#include <iostream>
using namespace std;

#define print(x, y) cout << x << ' ' << y << endl

int n, k, m;
bool spec[303];

int main() {
    cin >> n >> m >> k;
    if(k == n or n*(n-1)/2 - 2*(n-k-2) < m) {
        cout << -1;
        return 0;
    }
    for(int x; k -- > 0; ) {
        cin >> x;
        spec[x] = true;
    }
    int fix = 1, u = 1, v = 1;
    for(; spec[fix]; fix++);
    for(; u == fix; u++);
    for(; v == fix or v == u; v++);
    print(u, fix);
    print(v, fix);
    for(int i = 1; i <= n; i++) {
        for(int j = i+1; j <= n; j++) {
            if((i == u or i == v) and not spec[j]) {
                continue;
            }
            if((j == u or j == v) and not spec[i]) {
                continue;
            }
            if(m-- <= 2) {
                return 0;
            }
            print(i, j);
        }
    }
}


#include <iostream>
#include <vector>
using namespace std;

#define add(x, y) a.push_back(x), b.push_back(y)
#define cmp(a, b, x, y) (x == a and y == b or x == b and y == a)

int n, k, m;
bool spec[303];
vector<int> a, b;

int main() {
    cin >> n >> m >> k;
    if(k == n) {
        cout << -1;
        return 0;
    }
    for(int x, i = 0; i < k; i++) {
        cin >> x;
        spec[x] = true;
    }
    int fix = 1, u = 1, v = 1;
    for(; spec[fix]; fix++);
    for(; (n-k > 1? spec[u]: true) and u == fix; u++);
    for(; (n-k > 2? spec[v]: true) and v == fix or v == u; v++);
    add(u, fix);
    add(v, fix);
    for(int i = 1; i <= n; i++) {
        for(int j = i+1; j <= n; j++) {
            if((i == u and spec[j]) or (j == u and spec[i])) {
                continue;
            }
            if(cmp(u, fix, i, j) or cmp(v, fix, i, j) or cmp(u, v, i, j)) {
                continue;
            }
            add(i, j);
        }
    }
    if(a.size() >= m) {
        for(int i = 0; i < m; i++) {
            cout << a[i] << ' ' << b[i] << endl;
        }
    } else {
        cout << -1 << endl;
    }
}


#include <iostream>
#include <vector>
using namespace std;

#define add(x, y) a.push_back(x), b.push_back(y)
#define cmp(a, b, x, y) (x == a and y == b or x == b and y == a)

int n, k, m;
bool spec[303];
vector<int> a, b;

int main() {
    cin >> n >> m >> k;
    if(k == n) {
        cout << -1;
        return 0;
    }
    for(int x, i = 0; i < k; i++) {
        cin >> x;
        spec[x] = true;
    }
    int fix = 1, u = 1, v = 1;
    for(; spec[fix]; fix++);
    for(; (n-k > 1? not spec[u]: false) or u == fix; u++);
    for(; (n-k > 2? not spec[v]: false) or v == fix or v == u; v++);
    add(u, fix);
    for(int i = 1; i <= n; i++) {
        if(i != v and i != u) {
            add(v, i);
        }
    }
    for(int i = 1; i <= n; i++) {
        for(int j = i+1; j <= n; j++) {
            if(i == v or j == v or (i == u and spec[j]) or (j == u and spec[i]) or
               cmp(u, fix, i, j) or cmp(v, fix, i, j) or cmp(u, v, i, j)) {
                continue;
            }
            add(i, j);
        }
    }
    //cout << a.size() << " x " << m << endl;
    if(a.size() >= m) {
        for(int i = 0; i < m; i++) {
            cout << a[i] << ' ' << b[i] << endl;
        }
    } else {
        cout << -1 << endl;
    }
}


#include <iostream>
#include <vector>
using namespace std;

#define add(x, y) a.push_back(x), b.push_back(y)
#define cmp(a, b, x, y) (x == a and y == b or x == b and y == a)

int n, k, m;
bool spec[303];
vector<int> a, b;

int main() {
    cin >> n >> m >> k;
    if(k == n) {
        cout << -1;
        return 0;
    }
    for(int x; k -- > 0; ) {
        cin >> x;
        spec[x] = true;
    }
    int fix = 1, u = 1, v = 1;
    for(; spec[fix]; fix++);
    for(; u == fix; u++);
    for(; v == fix or v == u; v++);
    add(u, fix);
    add(v, fix);
    for(int i = 1; i <= n; i++) {
        for(int j = i+1; j <= n; j++) {
            if((i == u or i == v) and not spec[j]) {
                continue;
            }
            if((j == u or j == v) and not spec[i]) {
                continue;
            }
            if(cmp(u, fix, i, j) or cmp(v, fix, i, j) or cmp(u, v, i, j)) {
                continue;
            }
            add(i, j);
        }
    }
    if(a.size() >= m) {
        for(int i = 0; i < m; i++) {
            cout << a[i] << ' ' << b[i] << endl;
        }
    } else {
        cout << -1 << endl;
    }
}


#include <iostream>
#include <vector>
using namespace std;

#define add(x, y) a.push_back(x), b.push_back(y)
#define cmp(a, b, x, y) (x == a and y == b or x == b and y == a)

int n, k, m;
bool spec[303];
vector<int> a, b;

int main() {
    cin >> n >> m >> k;
    if(k == n) {
        cout << -1;
        return 0;
    }
    for(int x; k -- > 0; ) {
        cin >> x;
        spec[x] = true;
    }
    int fix = 1, u = 1, v = 1;
    for(; spec[fix]; fix++);
    for(; u == fix; u++);
    for(; v == fix or v == u; v++);
    add(u, fix);
    add(v, fix);#include <iostream>
#include <vector>
using namespace std;

#define add(x, y) a.push_back(x), b.push_back(y)
#define cmp(a, b, x, y) (x == a and y == b or x == b and y == a)

int n, k, m;
bool spec[303];
vector<int> a, b;

int main() {
    cin >> n >> m >> k;
    if(k == n) {
        cout << -1;
        return 0;
    }
    for(int x; k -- > 0; ) {
        cin >> x;
        spec[x] = true;
    }
    int fix = 1, u = 1, v = 1;
    for(; spec[fix]; fix++);
    for(; u == fix; u++);
    for(; v == fix or v == u; v++);
    add(u, fix);
    add(v, fix);
    for(int i = 1; i <= n; i++) {
        for(int j = i+1; j <= n; j++) {
            if((i == u or i == v) and not spec[j]) {
                continue;
            }
            if((j == u or j == v) and not spec[i]) {
                continue;
            }
            if(cmp(u, fix, i, j) or cmp(v, fix, i, j) or cmp(u, v, i, j)) {
                continue;
            }
            add(i, j);
        }
    }
    if(a.size() >= m) {
        for(int i = 0; i < m; i++) {
            cout << a[i] << ' ' << b[i] << endl;
        }
    } else {
        cout << -1 << endl;
    }
}


#include <iostream>
#include <vector>
using namespace std;

#define add(x, y) a.push_back(x), b.push_back(y)
#define cmp(a, b, x, y) (x == a and y == b or x == b and y == a)

int n, k, m;
bool spec[303];
vector<int> a, b;

int main() {
    cin >> n >> m >> k;
    if(k == n) {
        cout << -1;
        return 0;
    }
    for(int x, i = 0; i < k; i++) {
        cin >> x;
        spec[x] = true;
    }
    int fix = 1, u = 1, v = 1;
    for(; spec[fix]; fix++);
    for(; (n-k > 1? not spec[u]: false) or u == fix; u++);
    for(; (n-k > 2? not spec[v]: false) or v == fix or v == u; v++);
    add(u, fix);
    add(v, fix);
    for(int i = 1; i <= n; i++) {
        for(int j = i+1; j <= n; j++) {
            if((i == u and spec[j]) or (j == u and spec[i])) {
                continue;
            }
            if(cmp(u, fix, i, j) or cmp(v, fix, i, j) or cmp(u, v, i, j)) {
                continue;
            }
            add(i, j);
        }
    }
    cout << a.size() << " x " << m << endl;
    if(a.size() >= m) {
        for(int i = 0; i < m; i++) {
//            cout << a[i] << ' ' << b[i] << endl;
        }
    } else {
        cout << -1 << endl;
    }
}


#include <iostream>
#include <vector>
using namespace std;

#define add(x, y) a.push_back(x), b.push_back(y)
#define cmp(a, b, x, y) (x == a and y == b or x == b and y == a)

int n, k, m;
bool spec[303];
vector<int> a, b;

int main() {
    cin >> n >> m >> k;
    if(k == n) {
        cout << -1;
        return 0;
    }
    for(int x, i = 0; i < k; i++) {
        cin >> x;
        spec[x] = true;
    }
    int fix = 1, u = 1, v = 1;
    for(; spec[fix]; fix++);
    for(; (k > 1? not spec[u]: false) or u == fix; u++);
    for(; (k > 2? not spec[v]: false) or v == fix or v == u; v++);
    add(u, fix);
    for(int i = 1; i <= n; i++) {
        if(i != v and i != u) {
            add(v, i);
        }
    }
    //cout << u << fix << v << endl;
    for(int i = 1; i <= n; i++) {
        for(int j = i+1; j <= n; j++) {
            if(i == v or j == v or (i == u and spec[j]) or (j == u and spec[i]) or
               cmp(u, fix, i, j) or cmp(v, fix, i, j) or cmp(u, v, i, j)) {
                continue;
            }
            add(i, j);
        }
    }
    //cout << a.size() << " x " << m << endl;
    if(a.size() >= m) {
        for(int i = 0; i < m; i++) {
            cout << a[i] << ' ' << b[i] << endl;
        }
    } else {
        cout << -1 << endl;
    }
}


#include <iostream>
#include <vector>
using namespace std;

#define add(x, y) a.push_back(x), b.push_back(y)
#define cmp(a, b, x, y) (x == a and y == b or x == b and y == a)

int n, k, m;
bool spec[303];
vector<int> a, b;

int main() {
    cin >> n >> m >> k;
    if(k == n) {
        cout << -1;
        return 0;
    }
    for(int x, i = 0; i < k; i++) {
        cin >> x;
        spec[x] = true;
    }
    int fix = 1, u = 1, v = 1;
    for(; spec[fix]; fix++);
    for(; not spec[u] or u == fix; u++);
    for(; not spec[v] or v == fix or v == u; v++);
    add(u, fix);
    for(int i = 1; i <= n; i++) {
        if(i != v and i != u) {
            add(v, i);
        }
    }
    cout << u << fix << v << endl;
    for(int i = 1; i <= n; i++) {
        for(int j = i+1; j <= n; j++) {
            if(i == v or j == v or (i == u and spec[j]) or (j == u and spec[i]) or
               cmp(u, fix, i, j) or cmp(v, fix, i, j) or cmp(u, v, i, j)) {
                continue;
            }
            add(i, j);
        }
    }
    //cout << a.size() << " x " << m << endl;
    if(a.size() >= m) {
        for(int i = 0; i < m; i++) {
            cout << a[i] << ' ' << b[i] << endl;
        }
    } else {
        cout << -1 << endl;
    }
}


#include <iostream>
#include <vector>
using namespace std;

#define add(x, y) a.push_back(x), b.push_back(y)
#define cmp(a, b, x, y) (x == a and y == b or x == b and y == a)

int n, k, m;
bool spec[303];
vector<int> a, b;

int main() {
    cin >> n >> m >> k;
    if(k == n) {
        cout << -1;
        return 0;
    }
    for(int x, i = 0; i < k; i++) {
        cin >> x;
        spec[x] = true;
    }
    int fix = 1, u = 1, v = 1;
    for(; spec[fix]; fix++);
    for(; not spec[u] or u == fix; u++);
    for(; not spec[v] or v == fix or v == u; v++);
    add(u, fix);
    for(int i = 1; i <= n; i++) {
        if(i != v and i != u) {
            add(v, i);
        }
    }
    //cout << u << fix << v << endl;
    for(int i = 1; i <= n; i++) {
        for(int j = i+1; j <= n; j++) {
            if(i == v or j == v or (i == u and spec[j]) or (j == u and spec[i]) or
               cmp(u, fix, i, j) or cmp(v, fix, i, j) or cmp(u, v, i, j)) {
                continue;
            }
            add(i, j);
        }
    }
    //cout << a.size() << " x " << m << endl;
    if(a.size() >= m) {
        for(int i = 0; i < m; i++) {
            cout << a[i] << ' ' << b[i] << endl;
        }
    } else {
        cout << -1 << endl;
    }
}


#include <iostream>
#include <vector>
using namespace std;

#define add(x, y) a.push_back(x), b.push_back(y)
#define cmp(a, b, x, y) (x == a and y == b or x == b and y == a)

int n, k, m;
bool spec[303];
vector<int> a, b;

int main() {
    cin >> n >> m >> k;
    if(k == n) {
        cout << -1;
        return 0;
    }
    for(int x, i = 0; i < k; i++) {
        cin >> x;
        spec[x] = true;
    }
    int fix = 1, u = 1, v = 1;
    for(; spec[fix]; fix++);
    for(; (n-k > 1? spec[u]: true) or u == fix; u++);
    for(; (n-k > 2? spec[v]: true) or v == fix or v == u; v++);
    add(u, fix);
    add(v, fix);
    for(int i = 1; i <= n; i++) {
        for(int j = i+1; j <= n; j++) {
            if((i == u and spec[j]) or (j == u and spec[i])) {
                continue;
            }
            if(cmp(u, fix, i, j) or cmp(v, fix, i, j) or cmp(u, v, i, j)) {
                continue;
            }
            add(i, j);
        }
    }
    if(a.size() >= m) {
        for(int i = 0; i < m; i++) {
            cout << a[i] << ' ' << b[i] << endl;
        }
    } else {
        cout << -1 << endl;
    }
}


#include <iostream>
#include <vector>
using namespace std;

#define add(x, y) a.push_back(x), b.push_back(y)
#define cmp(a, b, x, y) (x == a and y == b or x == b and y == a)

int n, k, m;
bool spec[303];
vector<int> a, b;

int main() {
    cin >> n >> m >> k;
    if(k == n) {
        cout << -1;
        return 0;
    }
    for(int x, i = 0; i < k; i++) {
        cin >> x;
        spec[x] = true;
    }
    int fix = 1, u = 1, v = 1;
    for(; spec[fix]; fix++);
    for(; (n-k > 1? spec[u]: false) or u == fix; u++);
    for(; (n-k > 2? spec[v]: false) or v == fix or v == u; v++);
    add(u, fix);
    add(v, fix);
    for(int i = 1; i <= n; i++) {
        for(int j = i+1; j <= n; j++) {
            if((i == u and spec[j]) or (j == u and spec[i])) {
                continue;
            }
            if(cmp(u, fix, i, j) or cmp(v, fix, i, j) or cmp(u, v, i, j)) {
                continue;
            }
            add(i, j);
        }
    }
    if(a.size() >= m) {
        for(int i = 0; i < m; i++) {
            cout << a[i] << ' ' << b[i] << endl;
        }
    } else {
        cout << -1 << endl;
    }
}


#include <iostream>
#include <vector>
using namespace std;

#define add(x, y) a.push_back(x), b.push_back(y)
#define cmp(a, b, x, y) (x == a and y == b or x == b and y == a)

int n, k, m;
bool spec[303];
vector<int> a, b;

int main() {
    cin >> n >> m >> k;
    if(k == n) {
        cout << -1;
        return 0;
    }
    for(int x; k -- > 0; ) {
        cin >> x;
        spec[x] = true;
    }
    int fix = 1, u = 1, v = 1;
    for(; spec[fix]; fix++);
    for(; u == fix; u++);
    for(; v == fix or v == u; v++);
    add(u, fix);
    add(v, fix);
    for(int i = 1; i <= n; i++) {
        for(int j = i+1; j <= n; j++) {
            if((i == u or i == v) and spec[j]) {
                continue;
            }
            if((j == u or j == v) and spec[i]) {
                continue;
            }
            if(cmp(u, fix, i, j) or cmp(v, fix, i, j) or cmp(u, v, i, j)) {
                continue;
            }
            add(i, j);
        }
    }
    if(a.size() >= m) {
        for(int i = 0; i < m; i++) {
            cout << a[i] << ' ' << b[i] << endl;
        }
    } else {
        cout << -1 << endl;
    }
}


#include <iostream>
#include <vector>
using namespace std;

#define add(x, y) a.push_back(x), b.push_back(y)
#define cmp(a, b, x, y) (x == a and y == b or x == b and y == a)

int n, k, m;
bool spec[303];
vector<int> a, b;

int main() {
    cin >> n >> m >> k;
    if(k == n) {
        cout << -1;
        return 0;
    }
    for(int x; k -- > 0; ) {
        cin >> x;
        spec[x] = true;
    }
    int fix = 1, u = 1, v = 1;
    for(; not spec[fix]; fix++);
    for(; u == fix; u++);
    for(; v == fix or v == u; v++);
    add(u, fix);
    add(v, fix);
    for(int i = 1; i <= n; i++) {
        for(int j = i+1; j <= n; j++) {
            if((i == u or i == v) and not spec[j]) {
                continue;
            }
            if((j == u or j == v) and not spec[i]) {
                continue;
            }
            if(cmp(u, fix, i, j) or cmp(v, fix, i, j) or cmp(u, v, i, j)) {
                continue;
            }
            add(i, j);
        }
    }
    if(a.size() >= m) {
        for(int i = 0; i < m; i++) {
            cout << a[i] << ' ' << b[i] << endl;
        }
    } else {
        cout << -1 << endl;
    }
}


#include <iostream>
#include <vector>
using namespace std;

#define add(x, y) a.push_back(x), b.push_back(y)
#define cmp(a, b, x, y) (x == a and y == b or x == b and y == a)

int n, k, m;
bool spec[303];
vector<int> a, b;

int main() {
    cin >> n >> m >> k;
    if(k == n) {
        cout << -1;
        return 0;
    }
    for(int x, i = 0; i < k; i++) {
        cin >> x;
        spec[x] = true;
    }
    int fix = 1, u = 1, v = 1;
    for(; spec[fix]; fix++);
    for(; (n-k > 1? not spec[u]: false) or u == fix; u++);
    for(; (n-k > 2? not spec[v]: false) or v == fix or v == u; v++);
    add(u, fix);
    add(v, fix);
    for(int i = 1; i <= n; i++) {
        for(int j = i+1; j <= n; j++) {
            if((i == u and spec[j]) or (j == u and spec[i])) {
                continue;
            }
            if(cmp(u, fix, i, j) or cmp(v, fix, i, j) or cmp(u, v, i, j)) {
                continue;
            }
            add(i, j);
        }
    }
    //cout << a.size() << " x " << m << endl;
    if(a.size() >= m) {
        for(int i = 0; i < m; i++) {
            cout << a[i] << ' ' << b[i] << endl;
        }
    } else {
        cout << -1 << endl;
    }
}


#include <iostream>
using namespace std;

#define print(x, y) cout << x << ' ' << y << endl

int n, k, m;
bool spec[303];

int main() {
    cin >> n >> k >> m;
    if(k == n or n*(n-1)/2 - 2*(n-k-2) < m) {
        cout << -1;
        return 0;
    }
    for(int x; k -- > 0; ) {
        cin >> x;
        spec[x] = true;
    }
    int fix = 1, u = 1, v = 1;
    for(; spec[fix]; fix++);
    for(; u == fix; u++);
    for(; v == fix or v == u; v++);
    print(u, fix);
    print(v, fix);
    for(int i = 1; i <= n; i++) {
        for(int j = i+1; j <= n; j++) {
            if((i == u or i == v) and not spec[j]) {
                continue;
            }
            if((j == u or j == v) and not spec[i]) {
                continue;
            }
            if(m-- <= 2) {
                return 0;
            }
            print(i, j);
        }
    }
}


#include <bits/stdc++.h>

#define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; i++)
#define FORD(i,a,b) for(int i=(a),_b=(b); i>=_b; i--)
#define REP(i,a) for(int i=0,_a=(a); i<_a; i++)

#define DEBUG(x) { cout << #x << " = "; cout << x << endl; }
#define PR(a,n) { cout << #a << " = "; FOR(_,1,n) cout << a[_] << ' '; cout << endl; }
#define PR0(a,n) { cout << #a << " = "; REP(_,n) cout << a[_] << ' '; cout << endl; }
using namespace std;

//Buffer reading
int INP,AM,REACHEOF;
const int BUFSIZE = (1<<12) + 17;
char BUF[BUFSIZE+1], *inp=BUF;
#define GETCHAR(INP) { \
    if(!*inp && !REACHEOF) { \
        memset(BUF,0,sizeof BUF);\
        int inpzzz = fread(BUF,1,BUFSIZE,stdin);\
        if (inpzzz != BUFSIZE) REACHEOF = true;\
        inp=BUF; \
    } \
    INP=*inp++; \
}
#define DIG(a) (((a)>='0')&&((a)<='9'))
#define GN(j) { \
    AM=0;\
    GETCHAR(INP); while(!DIG(INP) && INP!='-') GETCHAR(INP);\
    if (INP=='-') {AM=1;GETCHAR(INP);} \
    j=INP-'0'; GETCHAR(INP); \
    while(DIG(INP)){j=10*j+(INP-'0');GETCHAR(INP);} \
    if (AM) j=-j;\
}
//End of buffer reading

const int MN = 333;
int n, m, k, good[MN], c[MN][MN], d[MN][MN], ke[MN][MN], x[MN], bad;

#define add(u,v) { ke[u][v] = ke[v][u] = 1; ++has; cout << u << ' ' << v << endl; if (has == m) return ; }

void solve() {
    int has = 0;
    int left = 1; if (left == bad) ++left;

    add(left, bad);
    FOR(i,1,n)
    if (i != left && i != bad)
        add(i, bad);

    FOR(i,1,n) FOR(j,1,n)
    if (i != left && i != bad)
        if (j != left && j != bad)
            add(i, j);
}

void solve2() {
    int left = x[1];
    int has = 0;
    add(left, bad);
    FOR(i,1,n)
    if (i != left && i != bad)
        add(i, bad);

    FOR(i,1,n) FOR(j,1,n)
    if (i != left && i != bad)
        if (j != left && j != bad)
            add(i, j);

    FOR(i,1,n)
    if (!good[i] && i != bad)
        add(left, i);
}

int main() {
    ios :: sync_with_stdio(false);
    while (cin >> n >> m >> k) {
        memset(good, false, sizeof good);
        FOR(i,1,k) cin >> x[i], good[x[i]] = true;
        if (k == n) {
            cout << -1 << endl;
            continue;
        }
        int gh;
        gh = (n-2) * (n-3) / 2 + n - 2 + n - k;

        if (m > gh || m < 2) {
            cout << -1 << endl;
            continue;
        }

        bad = 1;
        while (good[bad]) ++bad;

        memset(ke, 0, sizeof ke);

        if (bad == 1) solve();
        else solve2();

        // Check
        FOR(i,1,n) FOR(j,1,n)
        if (i == j) c[i][j] = 0;
        else if (ke[i][j]) c[i][j] = c[j][i] = 1;
        else c[i][j] = 1000111000;

        FOR(i,1,n) FOR(j,1,n) d[i][j] = c[i][j];

        FOR(t,1,k) {
            int v = x[t];
            FOR(i,1,n) FOR(j,1,n)
                c[i][j] = min(c[i][j], c[i][v] + c[v][j]);
        }

        FOR(t,1,n) {
            FOR(i,1,n) FOR(j,1,n)
                d[i][j] = min(d[i][j], d[i][t] + d[t][j]);
        }

        bool ok = false;
        FOR(i,1,n) FOR(j,1,n)
            if (c[i][j] != d[i][j]) {
                ok = true;
            }
        if (!ok) puts(":(");
    }
    return 0;
}


#include <bits/stdc++.h>

#define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; i++)
#define FORD(i,a,b) for(int i=(a),_b=(b); i>=_b; i--)
#define REP(i,a) for(int i=0,_a=(a); i<_a; i++)

#define DEBUG(x) { cout << #x << " = "; cout << x << endl; }
#define PR(a,n) { cout << #a << " = "; FOR(_,1,n) cout << a[_] << ' '; cout << endl; }
#define PR0(a,n) { cout << #a << " = "; REP(_,n) cout << a[_] << ' '; cout << endl; }
using namespace std;

//Buffer reading
int INP,AM,REACHEOF;
const int BUFSIZE = (1<<12) + 17;
char BUF[BUFSIZE+1], *inp=BUF;
#define GETCHAR(INP) { \
    if(!*inp && !REACHEOF) { \
        memset(BUF,0,sizeof BUF);\
        int inpzzz = fread(BUF,1,BUFSIZE,stdin);\
        if (inpzzz != BUFSIZE) REACHEOF = true;\
        inp=BUF; \
    } \
    INP=*inp++; \
}
#define DIG(a) (((a)>='0')&&((a)<='9'))
#define GN(j) { \
    AM=0;\
    GETCHAR(INP); while(!DIG(INP) && INP!='-') GETCHAR(INP);\
    if (INP=='-') {AM=1;GETCHAR(INP);} \
    j=INP-'0'; GETCHAR(INP); \
    while(DIG(INP)){j=10*j+(INP-'0');GETCHAR(INP);} \
    if (AM) j=-j;\
}
//End of buffer reading

const int MN = 333;
int n, m, k, good[MN], c[MN][MN], d[MN][MN], ke[MN][MN], x[MN], bad;

#define add(u,v) { ke[u][v] = ke[v][u] = 1; ++has; cout << u << ' ' << v << endl; if (has == m) return ; }

void solve2() {
    int left = x[1];
    int has = 0;

    FOR(i,1,n)
    if (i != bad)
        add(i, bad);

    FOR(i,1,n) FOR(j,i+1,n)
    if (i != left && i != bad)
        if (j != left && j != bad)
            add(i, j);

    FOR(i,1,n)
    if (!good[i] && i != bad)
        add(left, i);
    // if (has != m) cout << ":-O\n";
}

int main() {
    ios :: sync_with_stdio(false);
    while (cin >> n >> m >> k) {
        memset(good, false, sizeof good);
        FOR(i,1,k) cin >> x[i], good[x[i]] = true;
        if (k == n) {
            cout << -1 << endl;
            continue;
        }
        int gh;
        gh = (n-2) * (n-3) / 2 + n - 2 + n - k;

        if (m > gh || m < 2) {
            cout << -1 << endl;
            continue;
        }

        bad = 1;
        while (good[bad]) ++bad;

        memset(ke, 0, sizeof ke);

        solve2();
        continue;

        // Check
        FOR(i,1,n) FOR(j,1,n)
        if (i == j) c[i][j] = 0;
        else if (ke[i][j]) c[i][j] = c[j][i] = 1;
        else c[i][j] = 1000111000;

        FOR(i,1,n) FOR(j,1,n) d[i][j] = c[i][j];

        FOR(t,1,k) {
            int v = x[t];
            FOR(i,1,n) FOR(j,1,n)
                c[i][j] = min(c[i][j], c[i][v] + c[v][j]);
        }

        FOR(t,1,n) {
            FOR(i,1,n) FOR(j,1,n)
                d[i][j] = min(d[i][j], d[i][t] + d[t][j]);
        }

        bool ok = false;
        FOR(i,1,n) FOR(j,1,n)
            if (c[i][j] != d[i][j]) {
                ok = true;
            }
        if (!ok) cout << ":(\n";
    }
    return 0;
}


#include <bits/stdc++.h>

#define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; i++)
#define FORD(i,a,b) for(int i=(a),_b=(b); i>=_b; i--)
#define REP(i,a) for(int i=0,_a=(a); i<_a; i++)

#define DEBUG(x) { cout << #x << " = "; cout << x << endl; }
#define PR(a,n) { cout << #a << " = "; FOR(_,1,n) cout << a[_] << ' '; cout << endl; }
#define PR0(a,n) { cout << #a << " = "; REP(_,n) cout << a[_] << ' '; cout << endl; }
using namespace std;

//Buffer reading
int INP,AM,REACHEOF;
const int BUFSIZE = (1<<12) + 17;
char BUF[BUFSIZE+1], *inp=BUF;
#define GETCHAR(INP) { \
    if(!*inp && !REACHEOF) { \
        memset(BUF,0,sizeof BUF);\
        int inpzzz = fread(BUF,1,BUFSIZE,stdin);\
        if (inpzzz != BUFSIZE) REACHEOF = true;\
        inp=BUF; \
    } \
    INP=*inp++; \
}
#define DIG(a) (((a)>='0')&&((a)<='9'))
#define GN(j) { \
    AM=0;\
    GETCHAR(INP); while(!DIG(INP) && INP!='-') GETCHAR(INP);\
    if (INP=='-') {AM=1;GETCHAR(INP);} \
    j=INP-'0'; GETCHAR(INP); \
    while(DIG(INP)){j=10*j+(INP-'0');GETCHAR(INP);} \
    if (AM) j=-j;\
}
//End of buffer reading

const int MN = 333;
int n, m, k, good[MN], c[MN][MN], d[MN][MN], ke[MN][MN], x[MN], bad;

#define add(u,v) { ke[u][v] = ke[v][u] = 1; ++has; cout << u << ' ' << v << endl; if (has == m) return ; }

void solve() {
    int has = 0;
    int left = 1; if (left == bad) ++left;

    add(left, bad);
    FOR(i,1,n)
    if (i != left && i != bad)
        add(i, bad);

    FOR(i,1,n) FOR(j,1,n)
    if (i != left && i != bad)
        if (j != left && j != bad)
            add(i, j);
}

void solve2() {
    int left = x[1];
    int has = 0;
    add(left, bad);
    FOR(i,1,n)
    if (i != left && i != bad)
        add(i, bad);

    FOR(i,1,n) FOR(j,1,n)
    if (i != left && i != bad)
        if (j != left && j != bad)
            add(i, j);

    FOR(i,1,n)
    if (!good[i] && i != bad)
        add(left, i);
}

int main() {
    ios :: sync_with_stdio(false);
    while (cin >> n >> m >> k) {
        memset(good, false, sizeof good);
        FOR(i,1,k) cin >> x[i], good[x[i]] = true;
        if (k == n) {
            cout << -1 << endl;
            continue;
        }
        int gh;
        if (k == 1) gh = (n-2) * (n-3) / 2 + n - 2 + 1;
        else gh = (n-2) * (n-3) / 2 + n - 2 + n - k;

        if (m > gh || m < 2) {
            cout << -1 << endl;
            continue;
        }

        bad = 1;
        while (good[bad]) ++bad;

        memset(ke, 0, sizeof ke);

        if (bad == 1) solve();
        else solve2();

        // Check
        FOR(i,1,n) FOR(j,1,n)
        if (i == j) c[i][j] = 0;
        else if (ke[i][j]) c[i][j] = c[j][i] = 1;
        else c[i][j] = 1000111000;

        FOR(i,1,n) FOR(j,1,n) d[i][j] = c[i][j];

        FOR(t,1,k) {
            int v = x[t];
            FOR(i,1,n) FOR(j,1,n)
                c[i][j] = min(c[i][j], c[i][v] + c[v][j]);
        }

        FOR(t,1,n) {
            FOR(i,1,n) FOR(j,1,n)
                d[i][j] = min(d[i][j], d[i][t] + d[t][j]);
        }

        bool ok = false;
        FOR(i,1,n) FOR(j,1,n)
            if (c[i][j] != d[i][j]) {
                ok = true;
            }
        if (!ok) puts(":(");
    }
    return 0;
}


#include <bits/stdc++.h>

#define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; i++)
#define FORD(i,a,b) for(int i=(a),_b=(b); i>=_b; i--)
#define REP(i,a) for(int i=0,_a=(a); i<_a; i++)

#define DEBUG(x) { cout << #x << " = "; cout << x << endl; }
#define PR(a,n) { cout << #a << " = "; FOR(_,1,n) cout << a[_] << ' '; cout << endl; }
#define PR0(a,n) { cout << #a << " = "; REP(_,n) cout << a[_] << ' '; cout << endl; }
using namespace std;

//Buffer reading
int INP,AM,REACHEOF;
const int BUFSIZE = (1<<12) + 17;
char BUF[BUFSIZE+1], *inp=BUF;
#define GETCHAR(INP) { \
    if(!*inp && !REACHEOF) { \
        memset(BUF,0,sizeof BUF);\
        int inpzzz = fread(BUF,1,BUFSIZE,stdin);\
        if (inpzzz != BUFSIZE) REACHEOF = true;\
        inp=BUF; \
    } \
    INP=*inp++; \
}
#define DIG(a) (((a)>='0')&&((a)<='9'))
#define GN(j) { \
    AM=0;\
    GETCHAR(INP); while(!DIG(INP) && INP!='-') GETCHAR(INP);\
    if (INP=='-') {AM=1;GETCHAR(INP);} \
    j=INP-'0'; GETCHAR(INP); \
    while(DIG(INP)){j=10*j+(INP-'0');GETCHAR(INP);} \
    if (AM) j=-j;\
}
//End of buffer reading

const int MN = 333;
int n, m, k, good[MN], c[MN][MN], d[MN][MN], ke[MN][MN], x[MN], bad;

#define add(u,v) { ke[u][v] = ke[v][u] = 1; ++has; cout << u << ' ' << v << endl; if (has == m) return ; }

void solve() {
    int has = 0;
    int left = 1; if (left == bad) ++left;

    add(left, bad);
    FOR(i,1,n)
    if (i != left && i != bad)
        add(i, bad);

    FOR(i,1,n) FOR(j,1,n)
    if (i != left && i != bad)
        if (j != left && j != bad)
            add(i, j);
}

void solve2() {
    int left = x[1];
    int has = 0;
    add(left, bad);
    FOR(i,1,n)
    if (i != left && i != bad)
        add(i, bad);

    FOR(i,1,n) FOR(j,1,n)
    if (i != left && i != bad)
        if (j != left && j != bad)
            add(i, j);

    FOR(i,1,n)
    if (!good[i] && i != bad)
        add(left, i);
}

int main() {
    ios :: sync_with_stdio(false);
    while (cin >> n >> m >> k) {
        memset(good, false, sizeof good);
        FOR(i,1,k) cin >> x[i], good[x[i]] = true;
        if (k == n) {
            cout << -1 << endl;
            continue;
        }
        int gh;
        gh = (n-2) * (n-3) / 2 + n - 2 + n - k;

        if (m > gh || m < 2) {
            cout << -1 << endl;
            continue;
        }

        bad = 1;
        while (good[bad]) ++bad;

        memset(ke, 0, sizeof ke);

        solve2();

        // Check
        FOR(i,1,n) FOR(j,1,n)
        if (i == j) c[i][j] = 0;
        else if (ke[i][j]) c[i][j] = c[j][i] = 1;
        else c[i][j] = 1000111000;

        FOR(i,1,n) FOR(j,1,n) d[i][j] = c[i][j];

        FOR(t,1,k) {
            int v = x[t];
            FOR(i,1,n) FOR(j,1,n)
                c[i][j] = min(c[i][j], c[i][v] + c[v][j]);
        }

        FOR(t,1,n) {
            FOR(i,1,n) FOR(j,1,n)
                d[i][j] = min(d[i][j], d[i][t] + d[t][j]);
        }

        bool ok = false;
        FOR(i,1,n) FOR(j,1,n)
            if (c[i][j] != d[i][j]) {
                ok = true;
            }
        if (!ok) puts(":(");
    }
    return 0;
}


#include <bits/stdc++.h>

#define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; i++)
#define FORD(i,a,b) for(int i=(a),_b=(b); i>=_b; i--)
#define REP(i,a) for(int i=0,_a=(a); i<_a; i++)

#define DEBUG(x) { cout << #x << " = "; cout << x << endl; }
#define PR(a,n) { cout << #a << " = "; FOR(_,1,n) cout << a[_] << ' '; cout << endl; }
#define PR0(a,n) { cout << #a << " = "; REP(_,n) cout << a[_] << ' '; cout << endl; }
using namespace std;

//Buffer reading
int INP,AM,REACHEOF;
const int BUFSIZE = (1<<12) + 17;
char BUF[BUFSIZE+1], *inp=BUF;
#define GETCHAR(INP) { \
    if(!*inp && !REACHEOF) { \
        memset(BUF,0,sizeof BUF);\
        int inpzzz = fread(BUF,1,BUFSIZE,stdin);\
        if (inpzzz != BUFSIZE) REACHEOF = true;\
        inp=BUF; \
    } \
    INP=*inp++; \
}
#define DIG(a) (((a)>='0')&&((a)<='9'))
#define GN(j) { \
    AM=0;\
    GETCHAR(INP); while(!DIG(INP) && INP!='-') GETCHAR(INP);\
    if (INP=='-') {AM=1;GETCHAR(INP);} \
    j=INP-'0'; GETCHAR(INP); \
    while(DIG(INP)){j=10*j+(INP-'0');GETCHAR(INP);} \
    if (AM) j=-j;\
}
//End of buffer reading

const int MN = 333;
int n, m, k, good[MN], c[MN][MN], d[MN][MN], ke[MN][MN], x[MN], bad;

#define add(u,v) { ke[u][v] = ke[v][u] = 1; ++has; cout << u << ' ' << v << endl; if (has == m) return ; }

void solve2() {
    int left = x[1];
    int has = 0;

    FOR(i,1,n)
    if (i != bad)
        add(i, bad);

    FOR(i,1,n) FOR(j,i+1,n)
    if (i != left && i != bad)
        if (j != left && j != bad)
            add(i, j);

    FOR(i,1,n)
    if (!good[i] && i != bad)
        add(left, i);
    // if (has != m) cout << ":-O\n";
}

int main() {
    ios :: sync_with_stdio(false);
    while (cin >> n >> m >> k) {
        memset(good, false, sizeof good);
        FOR(i,1,k) cin >> x[i], good[x[i]] = true;
        if (k == n) {
            cout << -1 << endl;
            continue;
        }
        int gh;
        gh = (n-2) * (n-3) / 2 + n - 2 + n - k;

        if (m > gh || m < 2) {
            cout << -1 << endl;
            continue;
        }

        bad = 1;
        while (good[bad]) ++bad;

        memset(ke, 0, sizeof ke);

        solve2();

        // Check
        FOR(i,1,n) FOR(j,1,n)
        if (i == j) c[i][j] = 0;
        else if (ke[i][j]) c[i][j] = c[j][i] = 1;
        else c[i][j] = 1000111000;

        FOR(i,1,n) FOR(j,1,n) d[i][j] = c[i][j];

        FOR(t,1,k) {
            int v = x[t];
            FOR(i,1,n) FOR(j,1,n)
                c[i][j] = min(c[i][j], c[i][v] + c[v][j]);
        }

        FOR(t,1,n) {
            FOR(i,1,n) FOR(j,1,n)
                d[i][j] = min(d[i][j], d[i][t] + d[t][j]);
        }

        bool ok = false;
        FOR(i,1,n) FOR(j,1,n)
            if (c[i][j] != d[i][j]) {
                ok = true;
            }
        if (!ok) cout << ":(\n";
    }
    return 0;
}


#include <bits/stdc++.h>

#define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; i++)
#define FORD(i,a,b) for(int i=(a),_b=(b); i>=_b; i--)
#define REP(i,a) for(int i=0,_a=(a); i<_a; i++)

#define DEBUG(x) { cout << #x << " = "; cout << x << endl; }
#define PR(a,n) { cout << #a << " = "; FOR(_,1,n) cout << a[_] << ' '; cout << endl; }
#define PR0(a,n) { cout << #a << " = "; REP(_,n) cout << a[_] << ' '; cout << endl; }
using namespace std;

//Buffer reading
int INP,AM,REACHEOF;
const int BUFSIZE = (1<<12) + 17;
char BUF[BUFSIZE+1], *inp=BUF;
#define GETCHAR(INP) { \
    if(!*inp && !REACHEOF) { \
        memset(BUF,0,sizeof BUF);\
        int inpzzz = fread(BUF,1,BUFSIZE,stdin);\
        if (inpzzz != BUFSIZE) REACHEOF = true;\
        inp=BUF; \
    } \
    INP=*inp++; \
}
#define DIG(a) (((a)>='0')&&((a)<='9'))
#define GN(j) { \
    AM=0;\
    GETCHAR(INP); while(!DIG(INP) && INP!='-') GETCHAR(INP);\
    if (INP=='-') {AM=1;GETCHAR(INP);} \
    j=INP-'0'; GETCHAR(INP); \
    while(DIG(INP)){j=10*j+(INP-'0');GETCHAR(INP);} \
    if (AM) j=-j;\
}
//End of buffer reading

const int MN = 333;
int n, m, k, good[MN], c[MN][MN], d[MN][MN], ke[MN][MN], x[MN], bad;

#define add(u,v) { ke[u][v] = ke[v][u] = 1; ++has; cout << u << ' ' << v << endl; if (has == m) return ; }

void solve() {
    int has = 0;
    int left = 1; if (left == bad) ++left;

    add(left, bad);
    FOR(i,1,n)
    if (i != left && i != bad)
        add(i, bad);

    FOR(i,1,n) FOR(j,1,n)
    if (i != left && i != bad)
        if (j != left && j != bad)
            add(i, j);
}

int main() {
    ios :: sync_with_stdio(false);
    while (cin >> n >> m >> k) {
        memset(good, false, sizeof good);
        FOR(i,1,k) cin >> x[i], good[x[i]] = true;
        if (k == n) {
            cout << -1 << endl;
            continue;
        }
        int gh = (n-2) * (n-3) / 2 + n - 2 + 1;
        if (m > gh || m < 2) {
            cout << -1 << endl;
            continue;
        }

        bad = 1;
        while (good[bad]) ++bad;

        memset(ke, 0, sizeof ke);
        solve();

        // Check
        FOR(i,1,n) FOR(j,1,n)
        if (i == j) c[i][j] = 0;
        else if (ke[i][j]) c[i][j] = c[j][i] = 1;
        else c[i][j] = 1000111000;

        FOR(i,1,n) FOR(j,1,n) d[i][j] = c[i][j];

        FOR(t,1,k) {
            int v = x[t];
            FOR(i,1,n) FOR(j,1,n)
                c[i][j] = min(c[i][j], c[i][v] + c[v][j]);
        }

        FOR(t,1,n) {
            FOR(i,1,n) FOR(j,1,n)
                d[i][j] = min(d[i][j], d[i][t] + d[t][j]);
        }

        bool ok = false;
        FOR(i,1,n) FOR(j,1,n)
            if (c[i][j] != d[i][j]) {
                ok = true;
            }
        if (!ok) puts(":(");
    }
    return 0;
}


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
using namespace std;

typedef struct{
    int u,v;
}E;
const int maxn = 300+50;
int n,m,k;
int ne,nv;
int v[maxn];
E edge[maxn * maxn];
bool mark[maxn];
bool choose[maxn];
int mv[maxn];
void add_v(int i){
    mv[nv] = i;
    choose[i] = 1;
    nv++;
}
void add_e(int u,int v){
    if(!choose[u])add_v(u);
    if(!choose[v])add_v(v);
    edge[ne].u = u;
    edge[ne].v = v;
    ne ++;
}
void solve()
{
    bool ok = 1;
    if(n == k){
        ok = 0;
    }
    nv = 0,ne = 0;
    for(int i=0;i<=1;i++){
        add_v(v[i]);
    }
    for(int i=1;i<=n;i++){
        if(!choose[i] && !mark[i]){
            add_e(mv[0],i);
            add_e(mv[1],i);
            break;
        }
    }
    for(int i=0;i<k;i++){
        if(!choose[v[i]]){
            add_e(mv[0],v[i]);
        }
    }
    for(int i=1;i<=n;i++){
        if(!choose[i] && !mark[i]){
            for(int j=1;j<=n;j++){
                if(i!=j)
                add_e(i,j);
            }
        }
    }
    if(!ok){
        cout<<-1<<endl;
        return ;
    }
    if(ne >= k){
        for(int i=0;i<k;i++){
            cout<<edge[i].u<<" "<<edge[i].v<<endl;
        }
    }else
        cout<<-1<<endl;
}
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<k;i++){
        cin>>v[i];
        mark[v[i]] = 1;
    }
    solve();
    return 0;
}


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
using namespace std;

typedef struct{
    int u,v;
}E;
const int maxn = 300+50;
int n,m,k;
int ne,nv;
int v[maxn];
E edge[maxn * maxn];
bool mark[maxn];
bool choose[maxn];
int mv[maxn];
void add_v(int i){
    mv[nv] = i;
    choose[i] = 1;
    nv++;
}
void add_e(int u,int v){
    if(!choose[u])add_v(u);
    if(!choose[v])add_v(v);
    edge[ne].u = u;
    edge[ne].v = v;
    ne ++;
}
void solve()
{
    bool ok = 1;
    if(n == k){
        ok = 0;
    }
    nv = 0,ne = 0;
    for(int i=0;i<=1;i++){
        add_v(v[i]);
    }
    bool tmp = 0;
    for(int i=1;i<=n;i++){
        if(!choose[i] && !mark[i]){
            add_e(mv[0],i);
            add_e(mv[1],i);
            tmp = 1;
            break;
        }
    }
    if(!tmp)ok = 0;
    for(int i=0;i<k;i++){
        if(!choose[v[i]]){
            add_e(mv[0],v[i]);
        }
    }
    for(int i=1;i<=n;i++){
        if(!choose[i] && !mark[i]){
            for(int j=1;j<=n;j++){
                if(i!=j)
                add_e(i,j);
            }
        }
    }
    if(!ok){
        cout<<-1<<endl;
        return ;
    }
    if(ne >= m){
        for(int i=0;i<k;i++){
            cout<<edge[i].u<<" "<<edge[i].v<<endl;
        }
    }else
        cout<<-1<<endl;
}
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<k;i++){
        cin>>v[i];
        mark[v[i]] = 1;
    }
    solve();
    return 0;
}


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
using namespace std;

typedef struct{
    int u,v;
}E;
const int maxn = 300+50;
int n,m,k;
int ne,nv;
int v[maxn];
E edge[maxn * maxn];
bool mark[maxn];
bool choose[maxn];
int mv[maxn];
void add_v(int i){
    mv[nv] = i;
    choose[i] = 1;
    nv++;
}
void add_e(int u,int v){
    if(!choose[u])add_v(u);
    if(!choose[v])add_v(v);
    edge[ne].u = u;
    edge[ne].v = v;
    ne ++;
}
void solve()
{
    bool ok = 1;
    if(n == k){
        ok = 0;
    }
    nv = 0,ne = 0;
    for(int i=0;i<=1;i++){
        add_v(v[i]);
    }
    //bool tmp = 0;
    for(int i=1;i<=n;i++){
        if(!choose[i] && !mark[i]){
            add_e(mv[0],i);
            add_e(mv[1],i);
            //tmp = 1;
            break;
        }
    }
    //if(!tmp)ok = 0;
    for(int i=0;i<k;i++){
        if(!choose[v[i]]){
            add_e(mv[0],v[i]);
        }
    }

    for(int i=2;i<k;i++){
        for(int j=i+1;j<k;j++){
            add_e(v[i],v[j]);
        }
    }
    for(int i=1;i<=n;i++){
        if(!mark[i])
        for(int j=i+1;j<=n;j++){
            if(i==mv[2] && (j==mv[0] || j==mv[1]))continue;
            add_e(i,j);
        }
    }
    if(!ok){
        cout<<-1<<endl;
        return ;
    }
    if(ne >= m){
        for(int i=0;i<m;i++){
            cout<<edge[i].u<<" "<<edge[i].v<<endl;
        }
    }else
        cout<<-1<<endl;
}
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<k;i++){
        cin>>v[i];
        mark[v[i]] = 1;
    }
    solve();
    return 0;
}


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
using namespace std;

typedef struct{
    int u,v;
}E;
const int maxn = 300+50;
int n,m,k;
int ne,nv;
int v[maxn];
E edge[maxn * maxn];
bool has[maxn][maxn];
bool mark[maxn];
bool choose[maxn];
int mv[maxn];
void add_v(int i){
    mv[nv] = i;
    choose[i] = 1;
    nv++;
}
void add_e(int u,int v){
    if(u>v)swap(u,v);
    if(has[u][v])return;
    if(!choose[u])add_v(u);
    if(!choose[v])add_v(v);
    has[u][v] = 1;
    edge[ne].u = u;
    edge[ne].v = v;
    ne ++;
}
void solve()
{
    bool ok = 1;
    for(int i=1;i<=n;i++)
        has[i][i] = 1;
    if(n == k){
        ok = 0;
    }
    nv = 0,ne = 0;
    for(int i=0;i<=1;i++){
        add_v(v[i]);
    }
    for(int i=1;i<=n;i++){
        if(!choose[i] && !mark[i]){
            add_e(mv[0],i);
            add_e(mv[1],i);
            break;
        }
    }
    for(int i=1;i<=n;i++){
        if(!mark[i])
        for(int j=1;j<=n;j++){
            add_e(i,j);
        }
    }
    for(int i=2;i<k;i++){
        add_e(v[0],v[i]);
    }

    for(int i=2;i<k;i++){
        for(int j=2;j<k;j++){
            add_e(v[i],v[j]);
        }
    }
    if(!ok){
        cout<<-1<<endl;
        return ;
    }
    if(ne >= m){
        for(int i=0;i<m;i++){
            cout<<edge[i].u<<" "<<edge[i].v<<endl;
        }
    }else
        cout<<-1<<endl;
}
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<k;i++){
        cin>>v[i];
        mark[v[i]] = 1;
    }
    solve();
    return 0;
}


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
using namespace std;

typedef struct{
    int u,v;
}E;
const int maxn = 300+50;
int n,m,k;
int ne,nv;
int v[maxn];
E edge[maxn * maxn];
bool has[maxn][maxn];
bool mark[maxn];
bool choose[maxn];
int mv[maxn];
void add_v(int i){
    mv[nv] = i;
    choose[i] = 1;
    nv++;
}
void add_e(int u,int v){
    if(u>v)swap(u,v);
    if(has[u][v])return;
    if(!choose[u])add_v(u);
    if(!choose[v])add_v(v);
    has[u][v] = 1;
    edge[ne].u = u;
    edge[ne].v = v;
    ne ++;
}
void solve()
{
    bool ok = 1;
    for(int i=1;i<=n;i++)
        has[i][i] = 1;
    if(n == k){
        ok = 0;
    }
    nv = 0,ne = 0;
    for(int i=0;i<=1;i++){
        add_v(v[i]);
    }
    //bool tmp = 0;
    for(int i=1;i<=n;i++){
        if(!choose[i] && !mark[i]){
            add_e(mv[0],i);
            add_e(mv[1],i);
            //tmp = 1;
            break;
        }
    }
    //if(!tmp)ok = 0;
    for(int i=0;i<k;i++){
        if(!choose[v[i]]){
            add_e(v[0],v[i]);
        }
    }

    for(int i=2;i<k;i++){
        for(int j=i+1;j<k;j++){
            add_e(v[i],v[j]);
        }
    }
    for(int i=1;i<=n;i++){
        if(!mark[i])
        for(int j=1;j<=n;j++){
            if(!has[i][j])
            add_e(i,j);
        }
    }
    if(!ok){
        cout<<-1<<endl;
        return ;
    }
    if(ne >= m){
        for(int i=0;i<m;i++){
            cout<<edge[i].u<<" "<<edge[i].v<<endl;
        }
    }else
        cout<<-1<<endl;
}
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<k;i++){
        cin>>v[i];
        mark[v[i]] = 1;
    }
    solve();
    return 0;
}


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
using namespace std;

typedef struct{
    int u,v;
}E;
const int maxn = 300+50;
int n,m,k;
int ne,nv;
int v[maxn];
E edge[maxn * maxn];
bool has[maxn][maxn];
bool mark[maxn];
bool choose[maxn];
int mv[maxn];
void add_v(int i){
    mv[nv] = i;
    choose[i] = 1;
    nv++;
}
void add_e(int u,int v){
    if(u>v)swap(u,v);
    if(has[u][v])return;
    if(!choose[u])add_v(u);
    if(!choose[v])add_v(v);
    has[u][v] = 1;
    edge[ne].u = u;
    edge[ne].v = v;
    ne ++;
}
void solve()
{
    bool ok = 1;
    for(int i=1;i<=n;i++)
        has[i][i] = 1;
    if(n == k){
        ok = 0;
    }
    nv = 0,ne = 0;
    for(int i=0;i<=1;i++){
        add_v(v[i]);
    }
    //bool tmp = 0;
    for(int i=1;i<=n;i++){
        if(!choose[i] && !mark[i]){
            add_e(mv[0],i);
            add_e(mv[1],i);
            //tmp = 1;
            break;
        }
    }
    for(int i=1;i<=n;i++){
        if(!mark[i])
        for(int j=1;j<=n;j++){
            if(!has[i][j])
            add_e(i,j);
        }
    }
    //if(!tmp)ok = 0;
    for(int i=0;i<k;i++){
        if(!choose[v[i]]){
            add_e(v[0],v[i]);
        }
    }

    for(int i=2;i<k;i++){
        for(int j=i+1;j<k;j++){
            add_e(v[i],v[j]);
        }
    }
    if(!ok){
        cout<<-1<<endl;
        return ;
    }
    if(ne >= m){
        for(int i=0;i<m;i++){
            cout<<edge[i].u<<" "<<edge[i].v<<endl;
        }
    }else
        cout<<-1<<endl;
}
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<k;i++){
        cin>>v[i];
        mark[v[i]] = 1;
    }
    solve();
    return 0;
}


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
using namespace std;

typedef struct{
    int u,v;
}E;
const int maxn = 300+50;
int n,m,k;
int ne,nv;
int v[maxn];
E edge[maxn * maxn];
bool mark[maxn];
bool choose[maxn];
int mv[maxn];
void add_v(int i){
    mv[nv] = i;
    choose[i] = 1;
    nv++;
}
void add_e(int u,int v){
    if(!choose[u])add_v(u);
    if(!choose[v])add_v(v);
    edge[ne].u = u;
    edge[ne].v = v;
    ne ++;
}
void solve()
{
    bool ok = 1;
    if(n == k){
        ok = 0;
    }
    nv = 0,ne = 0;
    for(int i=0;i<=1;i++){
        add_v(v[i]);
    }
    //bool tmp = 0;
    for(int i=1;i<=n;i++){
        if(!choose[i] && !mark[i]){
            add_e(mv[0],i);
            add_e(mv[1],i);
            //tmp = 1;
            break;
        }
    }
    //if(!tmp)ok = 0;
    for(int i=0;i<k;i++){
        if(!choose[v[i]]){
            add_e(mv[0],v[i]);
        }
    }

    for(int i=2;i<k;i++){
        for(int j=i+1;j<k;j++){
            add_e(v[i],v[j]);
        }
    }
    for(int i=1;i<=n;i++){
        if(!mark[i])
        for(int j=i+1;j<=n;j++){
            add_e(i,j);
        }
    }
    if(!ok){
        cout<<-1<<endl;
        return ;
    }
    if(ne >= m){
        for(int i=0;i<k;i++){
            cout<<edge[i].u<<" "<<edge[i].v<<endl;
        }
    }else
        cout<<-1<<endl;
}
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<k;i++){
        cin>>v[i];
        mark[v[i]] = 1;
    }
    solve();
    return 0;
}


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
using namespace std;

typedef struct{
    int u,v;
}E;
const int maxn = 300+50;
int n,m,k;
int ne,nv;
int v[maxn];
E edge[maxn * maxn];
bool mark[maxn];
bool choose[maxn];
int mv[maxn];
void add_v(int i){
    mv[nv] = i;
    choose[i] = 1;
    nv++;
}
void add_e(int u,int v){
    if(!choose[u])add_v(u);
    if(!choose[v])add_v(v);
    edge[ne].u = u;
    edge[ne].v = v;
    ne ++;
}
void solve()
{
    bool ok = 1;
    if(n == k){
        ok = 0;
    }
    nv = 0,ne = 0;
    for(int i=0;i<=1;i++){
        add_v(v[i]);
    }
    bool tmp = 0;
    for(int i=1;i<=n;i++){
        if(!choose[i] && !mark[i]){
            add_e(mv[0],i);
            add_e(mv[1],i);
            tmp = 1;
            break;
        }
    }
    if(!tmp)ok = 0;
    for(int i=0;i<k;i++){
        if(!choose[v[i]]){
            add_e(mv[0],v[i]);
        }
    }
    for(int i=1;i<=n;i++){
        if(!choose[i] && !mark[i]){
            for(int j=1;j<=n;j++){
                if(i!=j)
                add_e(i,j);
            }
        }
    }
    if(!ok){
        cout<<-1<<endl;
        return ;
    }
    if(ne >= k){
        for(int i=0;i<k;i++){
            cout<<edge[i].u<<" "<<edge[i].v<<endl;
        }
    }else
        cout<<-1<<endl;
}
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<k;i++){
        cin>>v[i];
        mark[v[i]] = 1;
    }
    solve();
    return 0;
}


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
using namespace std;

typedef struct{
    int u,v;
}E;
const int maxn = 300+50;
int n,m,k;
int ne,nv;
int v[maxn];
E edge[maxn * maxn];
bool has[maxn][maxn];
bool mark[maxn];
bool choose[maxn];
int mv[maxn];
void add_v(int i){
    mv[nv] = i;
    choose[i] = 1;
    nv++;
}
void add_e(int u,int v){
    if(u>v)swap(u,v);
    if(has[u][v])return;
    if(!choose[u])add_v(u);
    if(!choose[v])add_v(v);
    has[u][v] = 1;
    edge[ne].u = u;
    edge[ne].v = v;
    ne ++;
}
void solve()
{
    bool ok = 1;
    for(int i=1;i<=n;i++)
        has[i][i] = 1;
    if(n == k){
        ok = 0;
    }
    nv = 0,ne = 0;
    for(int i=0;i<=1;i++){
        add_v(v[i]);
    }
    for(int i=1;i<=n;i++){
        if(!choose[i] && !mark[i]){
            add_e(mv[0],i);
            add_e(mv[1],i);
            break;
        }
    }
    for(int i=1;i<=n;i++){
        if(!mark[i])
        for(int j=1;j<=n;j++){
            add_e(i,j);
        }
    }
    for(int i=0;i<k;i++){
        add_e(v[0],v[i]);
    }

    for(int i=2;i<k;i++){
        for(int j=2;j<k;j++){
            add_e(v[i],v[j]);
        }
    }
    //cout<<ne<<"!!"<<endl;
    if(!ok){
        cout<<-1<<endl;
        return ;
    }
    if(ne >= m){
        for(int i=0;i<m;i++){
            cout<<edge[i].u<<" "<<edge[i].v<<endl;
        }
    }else
        cout<<-1<<endl;
}
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<k;i++){
        cin>>v[i];
        mark[v[i]] = 1;
    }
    solve();
    return 0;
}


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
using namespace std;

typedef struct{
    int u,v;
}E;
const int maxn = 300+50;
int n,m,k;
int ne,nv;
int v[maxn];
E edge[maxn * maxn];
bool has[maxn][maxn];
bool mark[maxn];
bool choose[maxn];
int mv[maxn];
void add_v(int i){
    mv[nv] = i;
    choose[i] = 1;
    nv++;
}
void add_e(int u,int v){
    if(u>v)swap(u,v);
    if(has[u][v])return;
    if(!choose[u])add_v(u);
    if(!choose[v])add_v(v);
    has[u][v] = 1;
    edge[ne].u = u;
    edge[ne].v = v;
    ne ++;
}
void solve()
{
    bool ok = 1;
    for(int i=1;i<=n;i++)
        has[i][i] = 1;
    if(n == k){
        ok = 0;
    }
    nv = 0,ne = 0;
    for(int i=0;i<=1;i++){
        add_v(v[i]);
    }
    for(int i=1;i<=n;i++){
        if(!choose[i] && !mark[i]){
            add_e(mv[0],i);
            add_e(mv[1],i);
            break;
        }
    }
    for(int i=1;i<=n;i++){
        if(!mark[i])
        for(int j=1;j<=n;j++){
            add_e(i,j);
        }
    }
    for(int i=0;i<k;i++){
        add_e(v[0],v[i]);
    }

    for(int i=2;i<k;i++){
        for(int j=2;j<k;j++){
            add_e(v[i],v[j]);
        }
    }
    cout<<ne<<"!!"<<endl;
    if(!ok){
        cout<<-1<<endl;
        return ;
    }
    if(ne >= m){
        for(int i=0;i<m;i++){
            cout<<edge[i].u<<" "<<edge[i].v<<endl;
        }
    }else
        cout<<-1<<endl;
}
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<k;i++){
        cin>>v[i];
        mark[v[i]] = 1;
    }
    solve();
    return 0;
}


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
using namespace std;

typedef struct{
    int u,v;
}E;
const int maxn = 300+50;
int n,m,k;
int ne,nv;
int v[maxn];
E edge[maxn * maxn];
bool mark[maxn];
bool choose[maxn];
int mv[maxn];
void add_v(int i){
    mv[nv] = i;
    choose[i] = 1;
    nv++;
}
void add_e(int u,int v){
    if(!choose[u])add_v(u);
    if(!choose[v])add_v(v);
    edge[ne].u = u;
    edge[ne].v = v;
    ne ++;
}
void solve()
{
    bool ok = 1;
    if(n == k){
        ok = 0;
    }
    nv = 0,ne = 0;
    for(int i=0;i<=1;i++){
        add_v(v[i]);
    }
    //bool tmp = 0;
    for(int i=1;i<=n;i++){
        if(!choose[i] && !mark[i]){
            add_e(mv[0],i);
            add_e(mv[1],i);
            //tmp = 1;
            break;
        }
    }
    //if(!tmp)ok = 0;
    for(int i=0;i<k;i++){
        if(!choose[v[i]]){
            add_e(mv[0],v[i]);
        }
    }

    for(int i=2;i<k;i++){
        for(int j=i+1;j<k;j++){
            add_e(v[i],v[j]);
        }
    }
    for(int i=1;i<=n;i++){
        if(!mark[i])
        for(int j=i+1;j<=n;j++){
            add_e(i,j);
        }
    }
    if(!ok){
        cout<<-1<<endl;
        return ;
    }
    if(ne >= m){
        for(int i=0;i<m;i++){
            cout<<edge[i].u<<" "<<edge[i].v<<endl;
        }
    }else
        cout<<-1<<endl;
}
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<k;i++){
        cin>>v[i];
        mark[v[i]] = 1;
    }
    solve();
    return 0;
}


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
using namespace std;

typedef struct{
    int u,v;
}E;
const int maxn = 300+50;
int n,m,k;
int ne,nv;
int v[maxn];
E edge[maxn * maxn];
bool mark[maxn];
bool choose[maxn];
int mv[maxn];
void add_v(int i){
    mv[nv] = i;
    choose[i] = 1;
    nv++;
}
void add_e(int u,int v){
    if(!choose[u])add_v(u);
    if(!choose[v])add_v(v);
    edge[ne].u = u;
    edge[ne].v = v;
    ne ++;
}
void solve()
{
    bool ok = 1;
    if(n == k){
        ok = 0;
    }
    nv = 0,ne = 0;
    for(int i=0;i<=1;i++){
        add_v(v[i]);
    }
    //bool tmp = 0;
    for(int i=1;i<=n;i++){
        if(!choose[i] && !mark[i]){
            add_e(mv[0],i);
            add_e(mv[1],i);
            //tmp = 1;
            break;
        }
    }
    //if(!tmp)ok = 0;
    for(int i=0;i<k;i++){
        if(!choose[v[i]]){
            add_e(mv[0],v[i]);
        }
    }
    for(int i=1;i<=n;i++){
        if(!choose[i] && !mark[i]){
            for(int j=1;j<=n;j++){
                if(i!=j)
                add_e(i,j);
            }
        }
    }
    if(!ok){
        cout<<-1<<endl;
        return ;
    }
    if(ne >= m){
        for(int i=0;i<k;i++){
            cout<<edge[i].u<<" "<<edge[i].v<<endl;
        }
    }else
        cout<<-1<<endl;
}
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<k;i++){
        cin>>v[i];
        mark[v[i]] = 1;
    }
    solve();
    return 0;
}