#include #include #include #include #include #include #define pb push_back #define mp make_pair #define xx first #define yy second #define rep(i,a,b) for(int i=(a),i##_end_=(b);i<=i##_end_;i++) #define dwn(i,a,b) for(int i=(a),i##_end_=(b);i>=i##_end_;i--) using namespace std; inline int read() { int x=0,f=1;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f; } typedef long long ll; typedef pair pii; const int maxn=200010; pii sta[maxn]; int n,a[maxn],flag,lc[maxn],rc[maxn]; pii seg[maxn]; void dfs(int x) { if(x<=n) return; if(flag) flag=0; else putchar(' '); printf("%d",seg[lc[x]].yy); dfs(lc[x]); dfs(rc[x]); } int main() { // freopen("data.in","r",stdin); // freopen("data.ans","w",stdout); int T=read(); while(T--) { n=read(); rep(i,1,n) a[i]=read(); int m=n,top=0; rep(i,1,n) { seg[i]=mp(i,i); sta[++top]=mp(a[i],i); while(top>1) { if(sta[top].xx==sta[top-1].xx) { lc[++m]=sta[top-1].yy; rc[m]=sta[top].yy; seg[m]=mp(seg[sta[top-1].yy].xx,seg[sta[top].yy].yy); top--;sta[top]=mp(sta[top].xx-1,m); } else break; } } if(top!=1||sta[top].xx) puts("Impossible"); else { puts("Possible"); flag=1; dfs(sta[top].yy); puts(""); } } return 0; }