#include <bits/stdc++.h>
using namespace std;
const long long N = 1e6 + 3;
const long long mod = 1e9 + 7;
const long long INF = 0x7f7f7f7f7f7f7f7f;
const int INFi = 0x7f7f7f7f;
long long n, a[N];
void solve() {
  cin >> n;
  vector<int> v2, v1, v3, c(n + 5);
  for (int i = 1; i <= n; i++) cin >> a[i];
  vector<pair<long long, long long> > ans;
  int st = n;
  for (int i = n; i >= 1; i--) {
    if (a[i] == 0) continue;
    if (a[i] == 1) {
      ans.push_back({st, i});
      v1.push_back(i);
      c[i] = st;
      st--;
    } else if (a[i] == 2) {
      if (v1.size() == 0) {
        cout << -1 << "\n";
        return;
      }
      ans.push_back({c[v1.back()], i});
      v1.pop_back();
      v2.push_back(i);
    } else if (a[i] == 3) {
      if (v1.size() == 0 && v2.size() == 0 && v3.size() == 0) {
        cout << -1 << "\n";
        return;
      }
      if (v3.size()) {
        ans.push_back({st, i});
        ans.push_back({st, v3.back()});
        v3.pop_back();
        st--;
      } else if (v2.size()) {
        ans.push_back({st, i});
        ans.push_back({st, v2.back()});
        v2.pop_back();
        st--;
      } else {
        ans.push_back({st, i});
        ans.push_back({st, v1.back()});
        v1.pop_back();
        st--;
      }
      v3.push_back(i);
    }
  }
  for (auto it : ans) {
    if (it.first < 1 || it.first > n) {
      cout << -1 << "\n";
      return;
    }
    if (it.second < 1 || it.second > n) {
      cout << -1 << "\n";
      return;
    }
  }
  cout << ans.size() << "\n";
  for (auto it : ans) cout << it.first << " " << it.second << "\n";
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout << fixed;
  cout << setprecision(15);
  ;
  int test = 1;
  for (int i = 1; i <= test; i++) {
    solve();
  }
}
