#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, t, k;
int a[N];
vector<int> g[N];
int fa[N];
int main() {
  scanf("%d%d%d", &n, &t, &k);
  for (int i = 1; i <= t; ++i) scanf("%d", a + i);
  int id = 1;
  vector<int> v[t + 1];
  for (int i = 1; i <= t; ++i) {
    for (int j = 0; j < a[i]; ++j) v[i].push_back(++id);
  }
  int mx = a[t];
  for (int i = t - 1; i >= 1; --i) {
    mx += a[i] - 1;
  }
  int mn = a[t];
  int last = a[t];
  vector<int> can;
  for (int i = t - 1; i >= 1; --i) {
    if (last < a[i]) {
      mn += a[i] - last;
      for (int j = a[i] - last; j < a[i] - 1; ++j) {
        fa[v[i][j]] = v[i].back();
        can.push_back(v[i][j]);
      }
      for (int j = 0; j < v[i + 1].size(); ++j) {
        g[v[i][min(a[i] - 1, j + a[i] - last)]].push_back(v[i + 1][j]);
      }
    } else {
      mn += 0;
      for (int j = 0; j < a[i] - 1; ++j) {
        fa[v[i][j]] = v[i].back();
        can.push_back(v[i][j]);
      }
      for (int j = 0; j < v[i + 1].size(); ++j) {
        g[v[i][min(a[i] - 1, j)]].push_back(v[i + 1][j]);
      }
    }
    last = a[i];
  }
  for (int i = 0; i < v[1].size(); ++i) g[1].push_back(v[1][i]);
  if (k <= mx && k >= mn) {
    while (k-- > mn) {
      int top = can.back();
      can.pop_back();
      for (int i : g[top]) {
        g[fa[top]].push_back(i);
      }
      g[top].clear();
    }
    printf("%d\n", n);
    for (int i = 1; i <= n; ++i) {
      for (auto j : g[i]) printf("%d %d\n", i, j);
    }
  } else {
    puts("-1");
  }
  return 0;
}
