#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 3e5 + 5;
const long double ost = 1e-9;
const long long MAX = 1e18;
vector<int> st[MAX_N];
vector<int> yrov[MAX_N];
int n, t, k, kol = 1;
int now = 1;
int tet[MAX_N] = {
    0,
};
void print_tree() {
  printf("%d\n", n);
  for (int i = 1; i < now; i++)
    for (int j = 1; j < st[i].size(); j++)
      if (st[i][j] != -1) printf("%d %d\n", i, st[i][j]);
}
int main() {
  for (int i = 0; i < MAX_N; i++) tet[i] = 1;
  int m = 0;
  scanf("%d%d%d", &n, &t, &k);
  int a[MAX_N];
  for (int i = 0; i < t; i++) {
    scanf("%d", &a[i]);
    m = max(m, a[i]);
  }
  for (int i = 1; i < t; i++)
    if (a[i] != 0 && a[i - 1] == 0) {
      cout << -1;
      return 0;
    }
  if (m > k) {
    cout << -1;
    return 0;
  }
  yrov[0].push_back(1);
  now++;
  for (int i = 0; i < t; i++) {
    int prev = yrov[i][0];
    st[yrov[i][0]].push_back(i);
    for (int j = 0; j < a[i]; j++) {
      yrov[i + 1].push_back(now);
      st[prev].push_back(now);
      now++;
    }
    kol = kol + a[i] - 1;
  }
  if (kol < k) {
    cout << -1;
    return 0;
  }
  for (int i = 1; i < now; i++) {
    if (st[i].size() > 2) {
      int r = 2;
      while (r < st[i].size() && kol != k) {
        int erov = st[i][0];
        for (int f = tet[erov]; f < yrov[erov].size(); f++) {
          tet[erov] = f;
          if (st[yrov[erov][f]].size() <= 1) {
            kol--;
            if (st[yrov[erov][f]].size() == 0)
              st[yrov[erov][f]].push_back(erov);
            st[yrov[erov][f]].push_back(st[i][r]);
            st[i][r] = -1;
            break;
          }
        }
        r++;
      }
      if (kol == k) {
        print_tree();
        return 0;
      }
    }
  }
  if (kol == k) {
    print_tree();
    return 0;
  }
  cout << -1;
  return 0;
}
