#include <bits/stdc++.h>
using namespace std;
const int N = 350;
int arr[N], in[N];
bool vis[N][N];
vector<pair<int, int> > edgeList;
void makeTree(int n, int k, int a) {
  edgeList.push_back(make_pair(in[0], a));
  edgeList.push_back(make_pair(a, in[1]));
  vis[a][in[0]] = vis[in[0]][a] = vis[a][in[1]] = vis[in[1]][a] = 1;
  int last = in[1];
  for (int i = 2; i < k; i++) {
    edgeList.push_back(make_pair(in[i], in[i - 1]));
    vis[in[i]][in[i - 1]] = vis[in[i - 1]][in[i]] = 1;
    last = in[i - 1];
  }
  for (int i = 1; i <= n; i++)
    if (i != a && !arr[i]) {
      edgeList.push_back(make_pair(last, i));
      vis[last][i] = vis[i][last] = 1;
      last = i;
    }
}
void extra(int n) {
  for (int i = 1; i <= n; i++)
    if (!arr[i])
      for (int j = 1; j <= n; j++)
        if (!vis[i][j]) {
          edgeList.push_back(make_pair(i, j));
          vis[i][j] = vis[j][i] = 1;
        }
  for (int i = 1; i <= n; i++) vis[in[0]][i] = vis[i][in[0]] = 1;
  for (int i = 1; i <= n; i++)
    if (arr[i])
      for (int j = 1; j <= n; j++)
        if (!vis[i][j]) {
          edgeList.push_back(make_pair(i, j));
          vis[i][j] = vis[j][i] = 1;
        }
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  ;
  int n, m, k, a;
  cin >> n >> m >> k;
  if (n == k) return cout << -1 << endl, 0;
  for (int i = 0; i < k; i++) {
    cin >> in[i];
    arr[in[i]] = 1;
  }
  for (int i = 1; i <= n; i++) {
    vis[i][i] = 1;
    if (!arr[i]) a = i;
  }
  makeTree(n, k, a);
  assert(edgeList.size() == n - 1);
  extra(n);
  if (m > (int)edgeList.size()) return cout << -1 << endl, 0;
  for (int i = 0; i < m; i++)
    cout << edgeList[i].first << ' ' << edgeList[i].second << '\n';
  return 0;
}
