#include <bits/stdc++.h>
using namespace std;
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
  cerr << name << " : " << arg1 << endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
  const char* comma = strchr(names + 1, ',');
  cerr.write(names, comma - names) << " : " << arg1 << " | ";
  __f(comma + 1, args...);
}
const int mod = 1000000007;
const int inf = 50000000;
const int maxn = 300010;
int n, t, k, A[maxn], L[maxn], isLeaf[maxn];
vector<int> level[maxn], adj[maxn];
int main() {
  scanf("%d %d %d", &n, &t, &k);
  int mxlvs = 0;
  level[0].push_back(1);
  isLeaf[1] = 1;
  A[0] = 1;
  L[0] = 0;
  int x = 1;
  for (int i = 1; i <= t; i++) {
    scanf("%d", &A[i]);
    mxlvs += A[i];
    L[i] = A[i] - 1 + (i == t);
    for (int j = 1; j <= A[i]; j++) {
      isLeaf[x + j] = 1;
      level[i].push_back(x + j);
    }
    x += A[i];
  }
  mxlvs -= (t - 1);
  if (mxlvs < k || k < A[t]) {
    printf("-1\n");
    return 0;
  }
  int red = mxlvs - k;
  for (int i = 2; i <= t; i++) {
    if (red >= min(L[i - 1], L[i])) {
      red -= min(L[i - 1], L[i]);
      L[i - 1] -= min(L[i - 1], L[i]);
    } else {
      L[i - 1] -= red;
      red = 0;
      break;
    }
  }
  if (red != 0) {
    printf("-1\n");
    return 0;
  }
  for (int i = 1; i <= t; i++) {
    int p1 = 0, p2 = 0;
    for (int j = 0; j < A[i - 1] - L[i - 1]; j++) {
      adj[level[i - 1][p1]].push_back(level[i][p2]);
      p1 += 1;
      p2 += 1;
    }
    while (p2 < level[i].size()) {
      adj[level[i - 1][0]].push_back(level[i][p2]);
      p2 += 1;
    }
  }
  printf("%d\n", n);
  for (int i = 1; i <= n; i++) {
    for (int it : adj[i]) {
      printf("%d %d\n", i, it);
    }
  }
  return 0;
}
