#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const long long INF = 0x3f3f3f3f3f3f3f3fll;
const int maxn = 200005;
int A[maxn];
int Min[maxn], Max[maxn], ans[maxn];
inline void add(int x, int y) { printf("%d %d\n", x, y); }
int main() {
  int n, T, K;
  scanf("%d%d%d", &n, &T, &K);
  for (int i = 1; i <= T; i++) scanf("%d", &A[i]);
  Max[1] = A[1], Min[1] = A[1];
  for (int i = 2; i <= T; i++) {
    Max[i] = A[i] - 1;
    Min[i] = max(A[i] - A[i - 1], 0);
  }
  int tmpMax = 0, tmpMin = 0;
  for (int i = 1; i <= T; i++) {
    tmpMax += Max[i];
    tmpMin += Min[i];
  }
  if (K > tmpMax || K < tmpMin) {
    printf("-1");
    return 0;
  }
  printf("%d\n", n);
  int res = K - tmpMin;
  for (int i = 1; i <= T; i++) ans[i] = Min[i];
  for (int i = 2; i <= T; i++) {
    if (res > Max[i] - Min[i]) {
      ans[i] = Max[i];
      res -= Max[i] - Min[i];
    } else {
      ans[i] = Min[i] + res;
      break;
    }
  }
  vector<int> V;
  int ndtot = 1;
  for (int i = 1; i <= A[1]; i++) {
    ndtot++;
    add(1, ndtot);
    V.push_back(ndtot);
  }
  for (int i = 2; i <= T; i++) {
    for (int j = 1; j <= ans[i] + 1; j++) {
      add(V[0], ndtot + j);
    }
    int st = 1;
    for (int j = ans[i] + 2; j <= A[i]; j++) {
      add(V[st++], ndtot + j);
    }
    V.clear();
    for (int j = 1; j <= A[i]; j++) {
      ndtot++;
      V.push_back(ndtot);
    }
  }
}
