#include <bits/stdc++.h>
using namespace std;
template <typename T>
T gcd(T a, T b) {
  return a ? gcd(b % a, a) : b;
}
template <typename T>
T lcm(T a, T b) {
  return (a / gcd(a, b)) * b;
}
string int_to_str_easy(long long n) {
  return n ? "" : int_to_str_easy(n / 10) + (char)('0' + n % 10);
}
template <typename T>
T sum(vector<T> v) {
  T ans = 0;
  for (T i : v) ans += i;
  return ans;
}
template <typename T>
bool is_prime_sqrt(T n) {
  if (n == 1) return false;
  T k = trunc(sqrt(n));
  for (T i = 2; i <= k; i++)
    if (n % i == 0) return false;
  return true;
}
bool is_down(char x) { return ('a' <= x && x <= 'z'); }
bool is_upper(char x) { return ('A' <= x && x <= 'Z'); }
bool is_digit(char x) { return ('0' <= x && x <= '9'); }
string follow(string s) {
  for (int i = 0; i < s.length(); i++)
    if (is_upper(s[i])) s[i] += 'a' - 'A';
  return s;
}
const long double pi = 3.141592653589793238462643383279;
const long double log23 = 1.58496250072115618145373894394781;
const long double eps = 1e-8;
const long double zero = 0;
const long long INF = 1e18;
const int COUT = 30;
const int prost = 239;
const long long prost64 = 239;
const int two = 2;
const long long sr = 31;
const long long MOD = 1000000007;
const int BIG = 1e9;
const int alf = 26;
const int MAX_N = 2 * 1e5 + 1;
const int MAX_M = 2001;
const int km = (1 << 18) - 1;
const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};
const int dxo[8] = {-1, -1, -1, 0, 1, 1, 1, 0};
const int dyo[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
const int bit_max = 32;
const string str_alf = "abcdefghijklmnopqrstuvwxyz";
const string str_alf_big = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
void solve() {
  cout << "-1";
  exit(0);
}
int n, t, k, a[MAX_N];
bool used[MAX_N];
int main() {
  cin.sync_with_stdio(0);
  cin >> n >> t >> k;
  for (int i = 0; i < t; i++) cin >> a[i];
  int s = a[t - 1];
  for (int i = 0; i < t - 1; i++)
    if (a[i] > a[i + 1]) s += a[i] - a[i + 1];
  if (s > k) solve();
  if ((n - t) < k) solve();
  cout << n << "\n";
  for (int i = 0; i < a[0]; i++) cout << 1 << " " << i + 2 << "\n";
  int go = k - s;
  s = 1;
  for (int i = 0; i < t - 1; i++) {
    if (a[i + 1] < a[i]) {
      int d = a[i] - a[i + 1];
      for (int j = s + a[i] - d; j < s + a[i]; j++) used[j] = true;
    }
    s += a[i];
  }
  for (int i = s; i < n; i++) used[i] = true;
  s = 1;
  for (int i = 0; i < t - 1; i++) {
    for (int j = s + 1; j < s + a[i] && !used[j] && go != 0; j++)
      used[j] = true, go--;
    s += a[i];
  }
  s = 1;
  for (int i = 0; i < t - 1; i++) {
    vector<int> has;
    for (int j = s; j < a[i] + s; j++)
      if (!used[j]) has.push_back(j);
    vector<int> to;
    for (int j = s + a[i]; j < s + a[i] + a[i + 1]; j++) to.push_back(j);
    for (int j = 0; j < has.size(); j++)
      cout << has[j] + 1 << " " << to[j] + 1 << "\n";
    for (int j = 0; j < to.size() - has.size(); j++)
      cout << has[0] + 1 << " " << to[has.size() + j] + 1 << "\n";
    s += a[i];
  }
  return 0;
}
