#include <bits/stdc++.h>
using namespace std;
int choose2(int n) { return n * (n - 1) / 2; }
bool special[305];
int adj[305][305];
int A[305];
void add_edge(int i, int j, int& M) {
  assert(!(adj[i][j] || adj[j][i]));
  assert(i != j);
  assert(M > 0);
  adj[i][j] = adj[j][i] = true;
  M--;
}
void try_edge(int i, int j, int& M) {
  if (M > 0 && !(adj[i][j] || adj[j][i])) {
    add_edge(i, j, M);
  }
}
bool vis[305];
int bfs(int s, int N) {
  memset(vis, 0, sizeof(vis));
  queue<int> Q;
  Q.push(s);
  int ans = 0;
  while (!Q.empty()) {
    int i = Q.front();
    Q.pop();
    if (vis[i]) continue;
    vis[i] = true;
    ans++;
    for (int j = (1); j <= (N); ++j) {
      if (adj[i][j] && !vis[j]) Q.push(j);
    }
  }
  return ans;
}
int main() {
  memset(special, false, sizeof(special));
  memset(adj, 0, sizeof(adj));
  int N, M, K;
  cin >> N >> M >> K;
  for (int i = (1); i <= (K); ++i) cin >> A[i], special[A[i]] = true;
  int cnt = choose2(N - 2) + 2 * (N - K) + (K - 2);
  if (M > cnt || N == K) {
    cout << -1 << endl;
    return 0;
  }
  int a = A[1];
  int b = A[K];
  assert(K >= 2);
  assert(a != b);
  vector<int> norms;
  vector<int> specs;
  for (int i = (1); i <= (N); ++i) {
    if (i == a || i == b) continue;
    if (special[i])
      specs.push_back(i);
    else
      norms.push_back(i);
  }
  assert((int)norms.size() + (int)specs.size() == N - 2 &&
         (int)specs.size() == K - 2);
  for (int i = 0; i < (((int)norms.size() - 1)); ++i)
    add_edge(norms[i], norms[i + 1], M);
  if (!specs.empty()) add_edge(norms.back(), specs.front(), M);
  for (int i = 0; i < (((int)specs.size() - 1)); ++i)
    add_edge(specs[i], specs[i + 1], M);
  assert(!norms.empty());
  add_edge(norms.back(), a, M);
  add_edge(norms.back(), b, M);
  assert(bfs(1, N) == N);
  for (int i = (1); i <= (N); ++i) {
    for (int j = (1); j <= (i - 1); ++j) {
      if (i == a || j == b || i == b || j == a) continue;
      try_edge(i, j, M);
    }
  }
  for (int i = (1); i <= (N); ++i) {
    if (special[i]) continue;
    try_edge(a, i, M);
    try_edge(b, i, M);
  }
  for (int i = (1); i <= (N); ++i) {
    if (!special[i]) continue;
    if (i == a) continue;
    try_edge(a, i, M);
  }
  assert(M == 0);
  for (int i = (1); i <= (N); ++i) {
    for (int j = (1); j <= (i - 1); ++j) {
      if (adj[i][j]) cout << i << " " << j << endl;
    }
  }
}
