#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 名词解释没做全
// 什么是节点的度不说清楚,看示例,大概是节点的边的数量
// 二分图大概是,所有V节点连接一个以上的U节点,线段可以独立
// 算法参考了网友,但是稍微做了一点修改
// 选出合适的左右队列后,直接填充生成的线段明显是错误的,两个点之间会出现多条线段,并且测试能够通过
// 这里尝试左序列升序,右序列降序,大致是对的,没有详细测试
bool Dfs(const vector<int>& d, int left, int i, vector<int>& l, vector<int>& r) {
    if(left == 0) {
        for(int j = i; j < (int)d.size(); j++) {
            r.push_back(j);
        }
        return true;
    }
    if(left < 0) {
        return false;
    }
    if(i == (int)d.size()) {
        return false;
    }
    l.push_back(i);
    if( Dfs(d, left - d[i], i+1, l, r) ) {
        return true;
    }
    l.pop_back();
    r.push_back(i);
    if( Dfs(d, left, i+1, l, r)) {
        return true;
    }
    r.pop_back();
    return false;
}
int main() {
    int n;
    cin >> n;
    vector<int> d(n);
    int sum = 0;
    for(auto& v : d) {
        cin >> v;
        sum += v;
    }
    int l = n/2;
    int r = n-l;
    auto line = sum / 2;
    if(sum&1 || l*r < line || line < r) {
        cout << "-1" << endl;
        return 0;
    }
    vector<int> left, right;
    if(!Dfs(d, sum/2, 0, left, right)) {
        cout << "-1" << endl;
        return 0;
    }
    cout << sum/2 << endl;
    sort(left.begin(), left.end(), [&d](int& l, int& r) {
        return d[l] > d[r];
    });
    sort(right.begin(), right.end(), [&d](int& l, int& r) {
        return d[l] < d[r];
    });
    for(auto li : left) {
        int j = 0;
        for(auto k = 0; k < d[li];k++) {
            while(d[right[j]] == 0) {
                j++;
            }
            cout << li + 1 << " " << right[j] + 1 << endl;
            d[right[j]]--;
            j++;
            j %= right.size();
        }
    }
}
// 64 位输出请用 printf("%lld")