#include <bits/stdc++.h>
using namespace std;
template <class T>
T abs(T n) {
  return n < 0 ? -n : n;
}
template <class T1, class T2>
T1 max(T1 a, T2 b) {
  return (a > b) ? a : b;
}
template <class T1, class T2>
T1 min(T1 a, T2 b) {
  return (a < b) ? a : b;
}
const long double PI = 3.141592653589793;
const double eps = 0.0000000001;
const long long inf = 1e9;
const int N = 200005;
int a[N], b[N], c[N], ans = 0, colv = 0;
vector<int> G[N], P[N];
bool used[N];
void dfs(int v) {
  colv++;
  used[v] = true;
  if (G[v].size() == 0) ans++;
  for (int i = 0; i < G[v].size(); i++) {
    if (!used[G[v][i]]) dfs(G[v][i]);
  }
}
void solve() {
  int n, t, k, mx = 1, mn = 0;
  cin >> n >> t >> k;
  for (int i = 1; i <= t; i++) {
    scanf("%d", &a[i]);
    mn = max(mn, a[i]);
    mx += a[i] - 1;
    b[i] = a[i];
  }
  if (k < mn || k > mx) {
    cout << -1 << endl;
    return;
  }
  for (int i = t - 1; i >= 1; i--) {
    b[i] += b[i + 1] - 1;
  }
  int cntv = 1;
  P[0].push_back(1);
  c[1] = 1;
  for (int i = 1; i <= t; i++) {
    int cnt = b[i] + c[i] - 1, cntk = a[i];
    vector<int>::iterator it = P[i - 1].begin();
    set<int> pp;
    while (cntk > 0) {
      if ((cnt < k || it == P[i - 1].end()) && it != P[i - 1].begin()) it--;
      G[*it].push_back(++cntv);
      P[i].push_back(cntv);
      pp.insert(*it);
      --cntk;
      --cnt;
      it++;
    }
    c[i + 1] = c[i] - pp.size() + a[i];
  }
  dfs(1);
  if (ans != k || colv != n) {
    cout << -1 << endl;
    return;
  }
  cout << n << endl;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < G[i].size(); j++) printf("%d %d\n", i, G[i][j]);
  }
}
int main() {
  int tests = 1;
  while (tests--) {
    solve();
  }
  return 0;
}
