#include #define ll long long #define maxn 200005 /*rem*/ #define mod 998244353 #define db double #define vi vector #define pb push_back #define iter set::iterator using namespace std; ll ksm(ll a, ll b) { if (!b) return 1; ll ns = ksm(a, b >> 1); ns = ns * ns % mod; if (b & 1) ns = ns * a % mod; return ns; } struct th { int l, r; bool operator < (const th &u)const { return l < u.l; } }; int id[maxn], ch[maxn][2], pl[maxn]; vector r[maxn]; int ot[maxn], ocnt; void dfs(int a) { // cout << "!@#!@#" << a << " " << pl[a] << " " << ch[a][0] << endl; if (ch[a][0]) ot[ocnt++] = pl[a], dfs(ch[a][0]), dfs(ch[a][1]); } int main() { int t; cin >> t; for (int i = 0; i < t; i++) { ocnt = 0; int n; scanf("%d", &n); int idcnt = n + 1; for (int j = 0; j < idcnt; j++) pl[j] = ch[j][0] = ch[j][1] = 0, r[j].clear(); for (int j = 1; j <= n; j++) { th u; u.l = u.r = j; int k; scanf("%d", &k); id[j] = j; r[k].pb(u); } int fl = 1; for (int i = n - 1; i >= 1; i--) { sort(r[i].begin(), r[i].end()); if (r[i].size() & 1){ fl = 0; break; } for (int j = 0; j < r[i].size(); j += 2) { th u = r[i][j], v = r[i][j + 1]; if (v.l != u.r + 1) { fl = 0; break; } th fn; fn.l = u.l, fn.r = v.r; ch[idcnt][0] = id[u.r], ch[idcnt][1] = id[v.r]; id[fn.r] = idcnt, pl[idcnt] = u.r; r[i - 1].pb(fn); idcnt++; } } if (r[0].size() != 1) fl = 0; if (!fl) { cout << "Impossible" << endl; continue; } cout << "Possible" << endl; dfs(idcnt - 1); for (int i = 0; i < ocnt; i++) { printf("%d", ot[i]); if (i == ocnt - 1) cout << endl; else printf(" "); } } return 0; }