#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const long long INF = 0x3f3f3f3f3f3f3fll;
const int MAX_N = 200010;
int n, K, T;
int a[MAX_N], pos[MAX_N], fa[MAX_N];
vector<int> vec[MAX_N];
void solve() {
  int least = a[T];
  a[0] = 1;
  for (int i = T - 1; i >= 0; --i) {
    if (a[i] > a[i + 1]) least += a[i] - a[i + 1];
  }
  if (least > K) {
    printf("-1\n");
    return;
  }
  pos[0] = 1;
  int use = 1;
  for (int i = 1; i <= T; ++i) {
    fa[++use] = pos[i - 1];
    pos[i] = use;
  }
  for (int i = 1; i <= T; ++i) {
    int size = vec[i - 1].size(), st = 0;
    for (int j = 2; j <= a[i]; ++j) {
      if (size == st)
        fa[++use] = pos[i - 1];
      else {
        fa[++use] = vec[i - 1][st++];
      }
      vec[i].push_back(use);
    }
  }
  int id = 2, alr = 0;
  while (1) {
    if (least == K || id > T) break;
    if (alr == vec[id].size()) alr = 0, id++;
    while (id <= T && alr == vec[id].size()) ++id;
    if (id > T) break;
    int t = vec[id][alr++];
    if (fa[t] != pos[id - 1]) ++least;
    fa[t] = pos[id - 1];
  }
  if (least != K && id > T) {
    printf("-1\n");
    return;
  }
  printf("%d\n", n);
  for (int i = 2; i <= n; ++i) {
    printf("%d %d\n", i, fa[i]);
  }
}
int main() {
  while (~scanf("%d%d%d", &n, &T, &K)) {
    for (int i = 1; i <= T; ++i) scanf("%d", &a[i]);
    for (int i = 0; i <= n; ++i) vec[i].clear();
    solve();
  }
  return 0;
}
