#include <bits/stdc++.h>
using namespace std;
int N, M, K, A[305];
int par[305];
vector<pair<int, int> > ans;
bool bad[305], edge[305][305];
int find(int x) {
  if (par[x] == x) return x;
  return par[x] = find(par[x]);
}
void unite(int u, int v) {
  if (!M || find(u) == find(v)) return;
  par[find(u)] = find(v);
  edge[u][v] = edge[v][u] = 1;
  M--;
  ans.push_back(make_pair(u, v));
}
int main() {
  for (int i = 0; i < 305; i++) par[i] = i;
  scanf("%d", &N);
  scanf("%d", &M);
  scanf("%d", &K);
  for (int i = 0; i < K; i++) {
    scanf("%d", &A[i]);
    bad[A[i]] = 1;
  }
  if (K == N || M + K - 1 > (N * (N - 1)) / 2) {
    puts("-1");
    return 0;
  }
  int v = 0;
  for (int i = 1; i <= N; i++)
    if (!bad[i]) {
      v = i;
      break;
    }
  unite(v, A[0]);
  unite(v, A[1]);
  for (int i = 1; i < K; i++) edge[A[0]][A[i]] = edge[A[i]][A[0]] = 1;
  for (int i = 1; i <= N; i++)
    for (int j = i + 1; j <= N; j++)
      if (!edge[i][j]) unite(i, j);
  for (int i = 1; i <= N; i++)
    for (int j = i + 1; j <= N; j++)
      if (M && !edge[i][j]) {
        edge[i][j] = edge[j][i] = 1;
        ans.push_back(make_pair(i, j));
        M--;
      }
  for (int i = 0; i < ans.size(); i++)
    printf("%d %d\n", ans[i].first, ans[i].second);
}
