#include <bits/stdc++.h>
using namespace std;
inline long long gcd(long long x, long long y) { return x ? gcd(y % x, x) : y; }
const long long mod = 1e9 + 7;
inline signed rd() {
  signed ans = 0;
  char last = ' ', ch = getchar();
  while (!(ch >= '0' && ch <= '9')) last = ch, ch = getchar();
  while (ch >= '0' && ch <= '9') ans = ans * 10 + ch - '0', ch = getchar();
  if (last == '-') ans = -ans;
  return ans;
}
inline long long QPow(long long a, long long b) {
  long long ans = 1;
  while (b) {
    if (b & 1) ans = ans * a % mod;
    a = a * a % mod;
    b >>= 1;
  }
  return ans;
}
long long exgcd(long long a, long long b, long long &x, long long &y) {
  long long d = a;
  if (b == 0)
    x = 1, y = 0;
  else {
    d = exgcd(b, a % b, y, x), y -= a / b * x;
  }
  return d;
}
const long double PI = 3.141592653589793115997963468544185161590576171875;
const long long maxn = 200005;
signed arr[maxn];
vector<signed> id[maxn];
signed vec[4][maxn];
signed Max[4][maxn << 2];
inline void pushup(signed *ptr, signed rt) {
  ptr[rt] = max(ptr[rt << 1], ptr[rt << 1 | 1]);
}
inline void build(signed *ptr, signed i, signed l, signed r, signed rt) {
  if (l == r) {
    if (vec[i][l]) ptr[rt] = l;
    return;
  }
  build(ptr, i, l, (l + r) >> 1, rt << 1);
  build(ptr, i, ((l + r) >> 1) + 1, r, rt << 1 | 1);
  pushup(ptr, rt);
}
inline void update(signed *ptr, signed l, signed r, signed rt, signed pos,
                   signed val) {
  if (l == r)
    ptr[rt] = val;
  else {
    signed md = (l + r) >> 1;
    if (pos <= md)
      update(ptr, l, md, rt << 1, pos, val);
    else
      update(ptr, md + 1, r, rt << 1 | 1, pos, val);
    pushup(ptr, rt);
  }
}
inline signed query(signed *ptr, signed l, signed r, signed rt, signed L,
                    signed R) {
  if (L > R) return 0;
  if (L <= l && r <= R) return ptr[rt];
  signed ans = 0;
  if (L <= (l + r) >> 1)
    ans = max(ans, query(ptr, l, (l + r) >> 1, rt << 1, L, R));
  if (R > (l + r) >> 1)
    ans = max(ans, query(ptr, ((l + r) >> 1) + 1, r, rt << 1 | 1, L, R));
  return ans;
}
signed top[4];
signed main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  long long t;
  long long n;
  cin >> n;
  for (long long i = 1; i <= n; i++) cin >> arr[i], id[arr[i]].push_back(i);
  for (long long i = 0; i < n; i++)
    if (id[i].size()) vec[i % 3][i + 1] = id[i].size();
  for (long long i = 0; i < 3; i++) build(Max[i], i, 1, n, 1);
  vector<signed> ans;
  if (id[0].size()) {
    ans.push_back(id[0].back());
    id[0].pop_back();
    vec[0][1]--;
    if (vec[0][1] == 0) update(Max[0], 1, n, 1, 1, 0);
    long long las = 0;
    while (ans.size() < n) {
      if (id[las + 1].size()) {
        ans.push_back(id[las + 1].back());
        vec[(las + 1) % 3][las + 2]--;
        if (vec[(las + 1) % 3][las + 2] == 0)
          update(Max[(las + 1) % 3], 1, n, 1, las + 2, 0);
        id[las + 1].pop_back();
        las++;
      } else {
        long long tmp = las + 1;
        long long tmp2 = -1;
        tmp2 = query(Max[tmp % 3], 1, n, 1, 1, tmp + 1);
        if (tmp2 == 0) {
          cout << "Impossible\n";
          return 0;
        } else {
          ans.push_back(id[tmp2 - 1].back());
          vec[(tmp2 - 1) % 3][tmp2]--;
          if (vec[(tmp2 - 1) % 3][tmp2] == 0)
            update(Max[(tmp2 - 1) % 3], 1, n, 1, tmp2, 0);
          id[tmp2 - 1].pop_back();
          las = tmp2 - 1;
        }
      }
    }
    cout << "Possible\n";
    for (long long i = 0; i < n; i++) cout << ans[i] << ' ';
  } else
    cout << "Impossible\n";
  return 0;
}
