#include <bits/stdc++.h>
using namespace std;
void add_edge(vector<vector<int> >& G, int u, int v) {
  if (u < v)
    G[u].push_back(v);
  else
    G[v].push_back(u);
}
int main() {
  int n, t, k;
  scanf("%d%d%d", &n, &t, &k);
  vector<int> dis(t + 1);
  for (int i = 0; i < t; i++) scanf("%d", &dis[i]);
  dis[t] = 0;
  vector<vector<int> > G(n + 1);
  vector<int> min_leaves(t + 1, 0);
  vector<int> max_leaves(t + 1, 0);
  for (int i = 0; i < t; i++) {
    min_leaves[i + 1] = min_leaves[i] + max(0, dis[i] - dis[i + 1]);
    max_leaves[i + 1] = max_leaves[i] + dis[i] - min(1, dis[i + 1]);
  }
  if (min_leaves[t] > k || max_leaves[t] < k) {
    printf("-1\n");
    return 0;
  }
  int id = n;
  k -= dis[t - 1];
  for (int i = t - 1; i >= 1; i--) {
    int id2 = id - dis[i];
    int new_leaves = min(k - min_leaves[i - 1], max(dis[i - 1] - 1, 0));
    k -= new_leaves;
    int oc = dis[i - 1] - new_leaves;
    int w = 0;
    for (int j = 0; j < dis[i]; j++) {
      if (w >= oc) w = 0;
      add_edge(G, id - j, id2 - w);
      w++;
    }
    id = id2;
  }
  for (int i = 0; i < dis[0]; i++) {
    add_edge(G, 1, 2 + i);
  }
  printf("%d\n", n);
  for (int i = 0; i < (int)G.size(); i++) {
    for (int j = 0; j < (int)G[i].size(); j++) {
      printf("%d %d\n", i, G[i][j]);
    }
  }
  return 0;
}
