#include <bits/stdc++.h>
using namespace std;
int ar[500];
int ismarked[500];
char vs[500];
vector<int> adj[500];
int edges[500][500];
int oppor[500][500];
void dfs(int u) {
  vs[u] = 1;
  int i, v;
  for (i = 0; i < adj[u].size(); i++) {
    v = adj[u][i];
    if (vs[v] == 1) continue;
    edges[u][v] = 1;
    edges[v][u] = 1;
    printf("%d %d\n", u + 1, v + 1);
    dfs(v);
  }
}
int main() {
  int n, m, k, i;
  scanf("%d%d%d", &n, &m, &k);
  memset(ismarked, 0, sizeof ismarked);
  memset(vs, 0, sizeof vs);
  memset(oppor, 0, sizeof oppor);
  memset(edges, 0, sizeof edges);
  for (i = 0; i < k; i++) {
    scanf("%d", &ar[i]);
    ar[i]--;
    ismarked[ar[i]] = 1;
  }
  if (m > (n - 1) * (n - 2) / 2 + (n - k) || k == n) {
    printf("-1\n");
    exit(0);
  }
  int j;
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      if (i == j) continue;
      if (i == ar[0] || j == ar[0]) continue;
      adj[i].push_back(j);
      adj[j].push_back(i);
      oppor[i][j] = 1;
      oppor[j][i] = 1;
    }
  }
  for (i = 0; i < n; i++) {
    if (i != ar[0] && ismarked[i] == 0) {
      adj[ar[0]].push_back(i);
      adj[i].push_back(ar[0]);
      oppor[ar[0]][i] = 1;
      oppor[i][ar[0]] = 1;
    }
  }
  dfs(0);
  m -= n - 1;
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      if (oppor[i][j] == 1 && edges[i][j] == 0) {
        if (m == 0) break;
        printf("%d %d\n", i + 1, j + 1);
        edges[i][j] = 1;
        edges[j][i] = 1;
        m--;
        if (m == 0) break;
      }
    }
    if (m == 0) break;
  }
}
