#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 5;
const int mod = 1e9 + 7;
long long qpow(long long a, long long b) {
  long long ans = 1;
  a %= mod;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1) ans = ans * a % mod;
    a = a * a % mod;
  }
  return ans;
}
long long gcd(long long a, long long b) { return b > 0 ? gcd(b, a % b) : a; }
int n, a[maxn], vis[maxn];
int now = 1, flag = 1;
vector<pair<int, int> > ans;
set<int> s1, s2, s3;
int gao(int i) {
  int p = 0;
  while (s1.size()) {
    p = *s1.begin();
    if (p < i || vis[p]) {
      s1.erase(p);
      p = 0;
    } else {
      return p;
    }
  }
  return p;
}
void add(int x, int y) { ans.push_back(make_pair(x, y)); }
signed main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", a + i);
    if (a[i] == 1) s1.insert(i);
  }
  vector<int> v;
  for (int i = 1; i <= n; i++)
    if (a[i] == 3) v.push_back(i);
  for (int i = 0; i < v.size(); i++) {
    if (i == v.size() - 1) {
      int f = 0;
      for (int p2 = v[i] + 1; p2 <= n; p2++) {
        if (a[p2] != 2) continue;
        for (int p1 = p2 + 1; p1 <= n; p1++) {
          if (a[p1] != 1) continue;
          f = 1;
          add(v[i], now);
          add(p2, now);
          now++;
          add(p2, now);
          add(p1, now);
          now++;
          vis[p2] = vis[p1] = 1;
          break;
        }
        break;
      }
      if (f) continue;
      for (int p1 = v[i] + 1; p1 <= n; p1++) {
        if (a[p1] != 1) continue;
        f = 1;
        add(v[i], now);
        add(p1, now);
        now += 1;
        add(p1, now);
        now += 1;
        vis[p1] = 1;
        break;
      }
      if (!f) flag = 0;
      break;
    }
    add(v[i], now);
    add(v[i + 1], now);
    now++;
  }
  for (int i = 1; i <= n; i++) {
    if (a[i] == 0 || vis[i]) continue;
    if (a[i] == 1) add(i, now++);
    if (a[i] == 2) {
      int p = gao(i);
      if (p == 0) {
        flag = 0;
        break;
      }
      add(i, now);
      add(p, now);
      vis[p] = 1, now++;
    }
  }
  if (now - 1 > n || ans.size() > 2 * n) {
    cout << "-1\n";
    return 0;
  }
  if (flag) {
    printf("%d\n", ans.size());
    for (auto p : ans) {
      printf("%d %d\n", p.second, p.first);
    }
  } else {
    cout << "-1\n";
  }
}
