#include <bits/stdc++.h>
using namespace std;
long long getint() {
  long long _x = 0, _tmp = 1;
  char _tc = getchar();
  while ((_tc < '0' || _tc > '9') && _tc != '-') _tc = getchar();
  if (_tc == '-') _tc = getchar(), _tmp = -1;
  while (_tc >= '0' && _tc <= '9') _x *= 10, _x += (_tc - '0'), _tc = getchar();
  return _x * _tmp;
}
long long mypow(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 1ll;
  long long _tmp = mypow(_a, _x / 2, _mod);
  _tmp = (_tmp * _tmp) % _mod;
  if (_x & 1) _tmp = (_tmp * _a) % _mod;
  return _tmp;
}
bool equal(double _x, double _y) { return _x > _y - 1e-7 && _x < _y + 1e-7; }
int __ = 1, cs;
void build() {}
multiset<pair<int, int> > S[3];
vector<int> ans;
int n, a[200010];
void init() {
  n = getint();
  for (int i = 0; i < 3; i++) {
    S[i].insert(make_pair(-200010, -1));
    S[i].insert(make_pair(200010, -1));
  }
  for (int i = 1; i <= n; i++) {
    a[i] = getint();
    S[a[i] % 3].insert(make_pair(a[i], i));
  }
}
bool can() {
  int now = 0;
  for (int i = 0; i < n; i++) {
    int nd = now % 3;
    if (S[nd].size() == 2) return false;
    multiset<pair<int, int> >::iterator it = S[nd].begin();
    it++;
    if (it->first > now) return false;
    it = S[nd].upper_bound(make_pair(now, 200010));
    it--;
    if (it->first > now) return false;
    if (it->second == -1) return false;
    now = (it->first) + 1;
    int idx = it->second;
    ans.push_back(idx);
    S[nd].erase(S[nd].find(make_pair(now - 1, idx)));
  }
  return true;
}
void solve() {
  if (can()) {
    puts("Possible");
    for (int i = 0; i < n; i++) {
      printf("%d", ans[i]);
      putchar(i == n - 1 ? '\n' : ' ');
    }
  } else
    puts("Impossible");
}
int main() {
  build();
  while (__--) {
    init();
    solve();
  }
}
