#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
const int maxn = 4e5 + 5;
int n, k, t;
int a[maxn], b[maxn], par[maxn];
int needadd[maxn];
vector<int> ve[maxn];
vector<int> subset[maxn];
void solve() {
  memset(needadd, -1, sizeof(needadd));
  needadd[0] = 0, needadd[1] = a[1] - 1;
  int cnt = 0, nowval = t - ve[0].size() - 1;
  for (int i = 0; i < ve[0].size(); i++) needadd[ve[0][i]] = 0;
  while (k) {
    cnt++;
    if (k <= nowval) {
      for (int i = 1; i <= t; i++) {
        if (needadd[i] >= 0) continue;
        needadd[i] = cnt;
        k--;
        if (!k) break;
      }
      for (int i = 1; i <= t; i++) {
        if (needadd[i] >= 0) continue;
        needadd[i] = cnt - 1;
      }
      break;
    }
    k -= nowval;
    nowval -= ve[cnt].size();
    for (int i = 0; i < ve[cnt].size(); i++) needadd[ve[cnt][i]] = cnt;
  }
  a[0] = 1;
  for (int i = 2; i <= t; i++) {
    if (needadd[i] == -1) needadd[i] = 0;
    if (a[i] > a[i - 1]) needadd[i] += a[i] - a[i - 1];
  }
  int pos = 1;
  subset[0].push_back(1);
  for (int i = 1; i <= t; i++) {
    int tmp = needadd[i], pre = 0;
    int fa = subset[i - 1][0];
    for (int j = 1; j <= tmp + 1; j++) {
      par[++pos] = fa;
      subset[i].push_back(pos);
    }
    for (int j = tmp + 2; j <= a[i]; j++) {
      fa = subset[i - 1][++pre];
      par[++pos] = fa;
      subset[i].push_back(pos);
    }
  }
  printf("%d\n", n);
  for (int i = 2; i <= n; i++) printf("%d %d\n", i, par[i]);
}
int main() {
  cin >> n >> t >> k;
  int minsum = 0, sum = 0;
  for (int i = 1; i <= t; i++) {
    scanf("%d", a + i);
    b[i] = a[i];
    if (i == 1)
      sum = a[i];
    else
      sum += a[i] - 1;
    if (a[i] >= a[i - 1]) {
      minsum += a[i] - a[i - 1];
      b[i] = a[i - 1];
      if (i > 1) ve[b[i] - 1].push_back(i);
    } else
      ve[b[i] - 1].push_back(i);
  }
  if (sum < k || minsum > k) {
    printf("-1\n");
    return 0;
  }
  k -= minsum;
  solve();
  return 0;
}
