#include <bits/stdc++.h>
using namespace std;
const int N = 200050;
inline void read(int& x, char s = getchar()) {
  x = 0;
  while (s > '9' || s < '0') s = getchar();
  while (s <= '9' && s >= '0') x = x * 10 + s - '0', s = getchar();
}
int n, t, k;
int d[N];
int fa[N];
int cnt;
vector<int> indep[N];
vector<int> g[N];
void dfs(int x) {
  for (int i = 0; i < (int)g[x].size(); i++) {
    printf("%d %d\n", x, g[x][i]);
    dfs(g[x][i]);
  }
}
int main() {
  cin >> n >> t >> k;
  cnt = n + 1;
  for (int i = 1; i <= t; i++) read(d[i]);
  for (int i = t; i >= 1; i--) {
    if (d[i] <= d[i + 1]) {
      for (int j = 0; j < d[i]; j++) {
        indep[i].push_back(--cnt);
        g[cnt].push_back(indep[i + 1][j]);
      }
      for (int j = d[i]; j < d[i + 1]; j++) {
        g[cnt].push_back(indep[i + 1][j]);
      }
    } else {
      for (int j = 0; j < d[i + 1]; j++) {
        indep[i].push_back(--cnt);
        g[cnt].push_back(indep[i + 1][j]);
      }
      for (int j = d[i + 1]; j < d[i]; j++) {
        k--;
        if (k < 0) {
          cout << -1 << endl;
          return 0;
        }
        indep[i].push_back(--cnt);
      }
    }
  }
  if (k) {
    for (int i = t - 1; i >= 1; i--) {
      for (int j = 1; j < (int)indep[i].size(); j++) {
        int u = indep[i][0], v = indep[i][j];
        if (g[v].size() == 0) continue;
        for (int l = (g[v].size() - 1); l >= 0; l--) {
          g[u].push_back(g[v][l]);
          g[v].pop_back();
        }
        k--;
        if (k == 0) break;
      }
      if (k == 0) break;
    }
  }
  if (k) {
    cout << -1 << endl;
    return 0;
  }
  cout << n << endl;
  for (int i = 0; i < (int)indep[1].size(); i++) {
    printf("1 %d\n", indep[1][i]);
    dfs(indep[1][i]);
  }
  return 0;
}
