#include <bits/stdc++.h>
using namespace std;
bool debug = 0;
int n, m, k;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
string direc = "RDLU";
long long ln, lk, lm;
void etp(bool f = 0) {
  puts(f ? "YES" : "NO");
  exit(0);
}
void addmod(int &x, int y, int mod = 1000000007) {
  x += y;
  if (x >= mod) x -= mod;
  assert(x >= 0 && x < mod);
}
void et() {
  puts("-1");
  exit(0);
}
vector<pair<int, int> > ans;
int t, a[200135], l[200135], r[200135], sl[200135], sr[200135], sa[200135];
void lnk(int pre, int cur, int num) {
  int preS = sa[pre - 1] + 1 + 1;
  int curS = sa[pre] + 1 + 1;
  int ed = sa[pre] + 1 - num;
  int edCur = sa[cur] + 1;
  for (int i = preS; i <= ed; i++) {
    ans.push_back({i, curS});
    curS++;
  }
  while (curS <= edCur) {
    ans.push_back({preS, curS++});
  }
}
void fmain() {
  scanf("%d%d%d", &n, &t, &k);
  for (int(i) = 1; (i) <= (int)(t); (i)++) scanf("%d", a + i);
  for (int(i) = 1; (i) <= (int)(t); (i)++) {
    if (i == t) {
      l[i] = r[i] = a[t];
    } else {
      r[i] = a[i] - 1;
      l[i] = max(a[i] - a[i + 1], 0);
    }
    sl[i] = sl[i - 1] + l[i];
    sr[i] = sr[i - 1] + r[i];
    sa[i] = a[i] + sa[i - 1];
  }
  if (k < sl[t] || sr[t] < k) et();
  int tk = k - a[t];
  for (int i = t; i > 1; i--) {
    int tar = l[i - 1];
    if (sl[i - 2] <= tk - tar && tk - tar <= sr[i - 2]) {
      lnk(i - 1, i, tar);
    } else {
      assert(tk - tar > sr[i - 2]);
      tar = tk - sr[i - 2];
      assert(tar >= l[i - 1] && tar <= r[i - 1]);
      lnk(i - 1, i, tar);
    }
    tk -= tar;
  }
  for (int(i) = 1; (i) <= (int)(a[1]); (i)++) {
    ans.push_back({1, i + 1});
  }
  printf("%d\n", n);
  for (auto p : ans) printf("%d %d\n", p.first, p.second);
}
int main() {
  int t = 1;
  for (int(i) = 1; (i) <= (int)(t); (i)++) {
    fmain();
  }
  return 0;
}
