#include <bits/stdc++.h>   using namespace std;   void err(istream_iterator<string> it) { cout << endl; }   template <typename T, typename... Args>   void err(istream_iterator<string> it, T a, Args... args) {     cerr << *it <<   =   << a <<    ;     err(++it, args...);   }   template <typename T>   inline void read(T& x) {     x = 0;     T f = 1;     char ch = getchar();     while (!isdigit(ch)) f = (ch ==  - ) ? -1 : 1, ch = getchar();     while (isdigit(ch)) x = x * 10 + ch - 48, ch = getchar();     x *= f;   }   template <typename T, typename... Args>   inline void read(T& x, Args&... args) {     read(x), read(args...);   }   constexpr int MAXN = 1e5 + 5, MOD = 1e9 + 7;   int n, cnt;   array<int, MAXN> a;   array<vector<pair<int, int>>, MAXN> p;   vector<int> id[4];   int main() {     ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);     ;     cin >> n;     for (int i = 1; i <= n; i++) cin >> a[i];     int high = n + 1;     for (int i = n; i >= 1; i--) {       if (a[i] == 0)         continue;       else if (a[i] == 1) {         if (high < 1) return cout << -1 <<   n , 0;         p[i].emplace_back(i, --high), id[1].push_back(i), cnt++;       } else if (a[i] == 2) {         if (id[1].size() == 0) return cout << -1 <<   n , 0;         int tmp = id[1].back();         id[1].pop_back();         p[i].emplace_back(i, p[tmp][0].second);         id[2].push_back(i), cnt++;       } else {         if (id[3].size()) {           int tmp = id[3].back();           id[3].pop_back();           if (high < 1) return cout << -1 <<   n , 0;           p[i].emplace_back(i, --high);           p[i].emplace_back(p[tmp][0].first, high);         } else if (id[2].size()) {           int tmp = id[2].back();           id[2].pop_back();           if (high < 1) return cout << -1 <<   n , 0;           p[i].emplace_back(i, --high);           p[i].emplace_back(p[tmp][0].first, high);         } else if (id[1].size()) {           int tmp = id[1].back();           id[1].pop_back();           if (high < 1) return cout << -1 <<   n , 0;           p[i].emplace_back(i, --high);           p[i].emplace_back(p[tmp][0].first, high);         } else           return cout << -1 <<   n , 0;         id[3].push_back(i);         cnt += 2;       }     }     cout << cnt <<   n ;     for (int i = n; i >= 1; i--)       for (auto& j : p[i]) cout << j.second <<     << j.first <<   n ;     return 0;   }   