#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
int N, a[MAXN], T, K, par[MAXN], ind[MAXN];
int NI = 2;
vector<int> D[MAXN];
int main() {
  scanf("%d", &N), scanf("%d", &T);
  scanf("%d", &K);
  a[0] = 1;
  for (int i = 1; i < (int)T + 1; i++) scanf("%d", &a[i]);
  bool good = true;
  for (int i = 1; i < (int)N; i++)
    if (a[i] != 0 && a[i - 1] == 0) good = false;
  int mxk = 0, mnk = 0;
  for (int i = 1; i < (int)T + 1; i++) mxk += max(0, a[i] - 1);
  mxk++;
  for (int i = 2; i < (int)T + 1; i++) mnk += max(0, a[i - 1] - a[i]);
  mnk += a[T];
  if (K < mnk || K > mxk || !good) {
    printf("-1\n");
    return 0;
  }
  D[0].push_back(1);
  for (int d = 1; d < (int)T + 1; d++) {
    for (int i = 0; i < (int)a[d]; i++) D[d].push_back(NI++);
  }
  for (int d = 1; d < (int)T + 1; d++) {
    for (int i = 0; i < (int)D[d].size(); i++) {
      if (i < (int)D[d - 1].size()) {
        par[D[d][i]] = D[d - 1][i];
        ind[D[d - 1][i]]++;
      } else {
        par[D[d][i]] = D[d - 1][0];
        ind[D[d - 1][0]]++;
      }
    }
  }
  int cur = mnk;
  for (int d = T + 1; d > (int)1; d--) {
    if (cur == K) break;
    for (int i = 0; i < (int)D[d].size(); i++) {
      if (par[D[d][i]] != D[d - 1][0]) {
        int u = par[D[d][i]];
        par[D[d][i]] = D[d - 1][0];
        ind[u]--;
        ind[D[d - 1][0]]++;
        if (ind[u] == 0) cur++;
      }
      if (cur == K) break;
    }
  }
  if (cur != K)
    printf("-1\n");
  else {
    printf("%d\n", N);
    for (int i = 2; i < (int)N + 1; i++) {
      printf("%d %d\n", par[i], i);
    }
  }
}
