#include <bits/stdc++.h>
using namespace std;
const int N = 2000010;
int n, m, k;
int arr[N], L[N], R[N];
vector<int> v[N];
vector<pair<int, int>> edges;
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= m; ++i) scanf("%d", &arr[i]);
  arr[0] = 1;
  int curl = 0, curr = 0;
  for (int i = 0; i <= m; ++i) {
    L[i] = (arr[i] > arr[i + 1]) ? arr[i] - arr[i + 1] : 0;
    R[i] = arr[i] - min(1, arr[i + 1]);
    curl += L[i];
    curr += R[i];
  }
  if (curl > k || curr < k) {
    printf("-1\n");
    return 0;
  }
  int extra = k - curl;
  v[0].push_back(1);
  int cur = 2;
  for (int lv = 1; lv <= m; ++lv) {
    int lastleaves = L[lv - 1];
    while (extra > 0) {
      if (extra > 0 && lastleaves < R[lv - 1]) {
        lastleaves++;
        extra--;
      } else
        break;
    }
    int used = (v[lv - 1].size() - lastleaves);
    int id = 0;
    for (int j = 0; j < arr[lv]; ++j) {
      edges.push_back({v[lv - 1][id], cur});
      v[lv].push_back(cur);
      cur++;
      id = (id + 1) % used;
    }
  }
  if (extra) {
    printf("-1\n");
    return 0;
  }
  printf("%d\n", n);
  for (auto p : edges) printf("%d %d\n", p.first, p.second);
}
