#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
vector<int> v[maxn];
int a[maxn], vis[maxn];
vector<int> level[maxn];
int main(void) {
  memset(vis, 0, sizeof(vis));
  int n, t, k;
  scanf("%d%d%d", &n, &t, &k);
  int idx = 1;
  for (int i = 1; i <= t; i++) {
    scanf("%d", &a[i]);
    for (int j = 1; j <= a[i]; j++) {
      level[i].push_back(++idx);
    }
  }
  level[0].push_back(1);
  for (int i = 1; i <= t; i++) {
    for (int j = 0; j < level[i].size(); j++) {
      if (j < level[i - 1].size()) {
        v[level[i][j]].push_back(level[i - 1][j]);
        vis[level[i - 1][j]] = 1;
      } else {
        v[level[i][j]].push_back(level[i - 1][0]);
      }
    }
  }
  int dead = 0;
  for (int i = 1; i <= n; i++) {
    if (vis[i] == 0) {
      dead++;
    }
  }
  for (int i = t; i >= 2; i--) {
    if (dead == k) break;
    for (int j = level[i].size() - 1; j > 0; j--) {
      if (dead == k) break;
      if (v[level[i][j]][0] != level[i - 1][0]) {
        v[level[i][j]][0] = level[i - 1][0];
        dead++;
      }
    }
  }
  if (dead != k) {
    printf("-1\n");
    return 0;
  }
  printf("%d\n", n);
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < v[i].size(); j++) {
      printf("%d %d\n", i, v[i][j]);
    }
  }
  return 0;
}
