#include <bits/stdc++.h>
using namespace std;
const bool MULTIPLE_CASES = 0;
const bool PRINT_CASE_MSG = 0;
using i64 = long long;
using pii = pair<int, int>;
const int INF = (1 << 30);
const int NMAX = 1e5;
void solve() {
  int N;
  cin >> N;
  vector<int> ask(N);
  for (auto &i : ask) cin >> i;
  vector<int> zero, unu, doi;
  vector<int> unde_unu(N + 1);
  int unde_doi[N + 1];
  vector<int> doi_pt_trei;
  vector<pii> sol;
  for (int i = 1; i <= N; ++i) {
    zero.push_back(i);
  }
  map<int, int> nu_am_voie_doi;
  for (int i = N - 1; i >= 0; --i) {
    if (ask[i] == 0) continue;
    if (ask[i] == 1) {
      int lin = zero.back();
      zero.pop_back();
      sol.push_back({lin, i + 1});
      unu.push_back(lin);
      unde_unu[lin] = i + 1;
    } else if (ask[i] == 2) {
      if (unu.size() < 1) {
        cout << "-1\n";
        return;
      }
      int lin = unu.back();
      unu.pop_back();
      sol.push_back({lin, i + 1});
      doi.push_back(lin);
      unde_doi[lin] = i + 1;
    } else if (ask[i] == 3) {
      if (doi.size() > 0) {
        int lin = doi.back();
        int lin_zero = zero.back();
        doi.pop_back();
        zero.pop_back();
        sol.push_back({lin_zero, i + 1});
        sol.push_back({lin_zero, unde_doi[lin]});
        doi.push_back(lin_zero);
        unde_doi[lin_zero] = i + 1;
      } else if (unu.size() > 0) {
        int lin_zero = zero.back();
        int lin = unu.back();
        unu.pop_back();
        zero.pop_back();
        sol.push_back({lin_zero, i + 1});
        sol.push_back({lin_zero, unde_unu[lin]});
        doi.push_back(lin_zero);
        unde_doi[lin_zero] = i + 1;
      } else {
        cout << "-1\n";
        return;
      }
    }
  }
  cout << sol.size() << '\n';
  for (auto x : sol) {
    cout << x.first << ' ' << x.second << '\n';
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  auto testMessage = [](int id) { return "Case #" + to_string(id) + ": "; };
  int T = 1;
  if (MULTIPLE_CASES) cin >> T;
  for (int t = 1; t <= T; ++t) {
    cout << (PRINT_CASE_MSG ? testMessage(t) : "");
    solve();
  }
}
