#include <bits/stdc++.h>
using namespace std;
int N, T, K, ar[200007], master[200007], last[200007], addL;
struct node {
  int dad;
  int master;
} nodes[200007];
void read() {
  scanf("%d %d %d", &N, &T, &K);
  for (int i = 1; i <= T; i++) scanf("%d", &ar[i]);
}
void connect() {
  for (int j = master[1]; j <= last[1]; j++) nodes[j].dad = 1;
  for (int i = 2; i <= T; i++) {
    for (int j = master[i], k = master[i - 1]; j <= last[i]; k++, j++) {
      if (k <= last[i - 1])
        nodes[j].dad = k;
      else
        nodes[j].dad = master[i - 1];
    }
  }
}
void addLeafs() {
  if (addL == 0) return;
  for (int i = 2; i <= T; i++)
    for (int j = master[i]; j <= last[i]; j++) {
      if (nodes[j].dad != master[i - 1]) {
        addL--;
        nodes[j].dad = master[i - 1];
        if (addL == 0) return;
      }
    }
}
void process() {
  int maxL = 1, minL = ar[T];
  for (int i = 1; i <= T; i++) {
    maxL += ar[i] - 1;
    if (i > 1 && ar[i] < ar[i - 1]) minL += ar[i - 1] - ar[i];
  }
  if (maxL < K || minL > K) {
    printf("-1\n");
    return;
  }
  nodes[1].master = 1;
  int curMaster = 2;
  for (int i = 1; i <= T; i++) {
    master[i] = curMaster;
    last[i] = master[i] + ar[i] - 1;
    for (int j = master[i]; j <= last[i]; j++) nodes[j].master = curMaster;
    curMaster += ar[i];
  }
  connect();
  addL = K - minL;
  addLeafs();
  printf("%d\n", N);
  for (int i = 2; i <= N; i++) printf("%d %d\n", i, nodes[i].dad);
}
int main() {
  read();
  process();
  return 0;
}
