#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int N = 100009;
const int inf = 0x3f3f3f3f;
const long long oo = 0x3f3f3f3f3f3f3f3fll;
int n, m, k, a[N], vis[N];
struct Edge {
  int a, b;
  Edge(int a, int b) : a(a), b(b) {}
};
int p[N];
int find(int x) {
  if (x != p[x]) p[x] = find(p[x]);
  return p[x];
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 0; i < k; i++) {
    scanf("%d", &a[i]);
    vis[a[i]] = 1;
  }
  if (m == n * (n - 1) / 2 || k == n) {
    cout << -1 << endl;
    return 0;
  }
  vector<Edge> vt, ans;
  for (int i = 1; i <= n; i++) p[i] = i;
  for (int i = 1; i <= n; i++) {
    if (i == a[0] || i == a[1]) continue;
    for (int j = i + 1; j <= n; j++) {
      if (j == a[0] || j == a[1]) continue;
      if (find(i) == find(j))
        vt.push_back(Edge(i, j));
      else
        ans.push_back(Edge(i, j)), p[find(i)] = find(j);
    }
  }
  for (int i = 1; i <= n; i++) {
    if (i == a[0] || i == a[1]) continue;
    if (vis[i]) {
      vt.push_back(Edge(i, a[1]));
    } else {
      if (find(i) == find(a[1]))
        vt.push_back(Edge(i, a[1]));
      else
        ans.push_back(Edge(i, a[1])), p[find(i)] = find(a[1]);
      if (find(i) == find(a[0]))
        vt.push_back(Edge(i, a[0]));
      else
        ans.push_back(Edge(i, a[0])), p[find(i)] = find(a[0]);
    }
  }
  int t = 0;
  while (ans.size() < m) {
    if (t == vt.size()) break;
    ans.push_back(vt[t++]);
  }
  if (ans.size() != m)
    cout << -1 << endl;
  else {
    for (int i = 0; i < ans.size(); i++)
      cout << ans[i].a << " " << ans[i].b << endl;
  }
  return 0;
}
