#include #define ll long long #define debug(...) fprintf(stderr,__VA_ARGS__) using namespace std; inline static int read(){ int sum=0,neg=0,ch=getchar(); while(!isdigit(ch)) neg|=(ch=='-'),ch=getchar(); while(isdigit(ch)) sum=sum*10+(ch^48),ch=getchar(); return neg?-sum:sum; } vectore[200005],Ans[200005]; int n,id[200005],head[200005],ecnt; struct{int v,w,nxt;}_e[400005]; int col[200005],ptr[200005],eid[200005]; void _add(int u,int v,int w){_e[++ecnt]={v,w,head[u]},head[u]=ecnt;} void add(int u,int v,int i,int j){_add(u,v,i),_add(v,u,j);} int dfs(int u,int fa){ for(int&x:Ans[u]) x=++ptr[col[u]]; vectorvec; int e2f=0; for(int i=head[u];i;i=_e[i].nxt){ int v=_e[i].v; if(v==fa){e2f=_e[i].w; continue;} if(dfs(v,u)==Ans[u][_e[i].w]) vec.push_back(_e[i].w); } if(vec.size()&1) vec.push_back(e2f); for(int i=0;i>Set; int ord[200005]; vectorleaf; bool check(int Q,int rt){ Set.clear(); int _rt=_e[head[rt]].v; for(int i=2;i<=Q;i++) Set.emplace(Q,i); col[rt]=col[_rt]=1,Set.emplace(Q-e[rt].size()-e[_rt].size(),1); for(int _i=1,i=ord[1];_i<=n;i=ord[++_i]) if(i!=rt && i!=_rt){ auto it=prev(Set.end()); if(it->firstfirst-e[i].size(),col[i]=it->second),Set.erase(it); } return 1; } signed main(){ // freopen("hjx.in","r",stdin); // freopen("hjx.out","w",stdout); for(int T=read();T;T--){ n=read(),leaf.clear(),memset(head,ecnt=0,4*n+4); int C=0,rt=0; memset(id,0,4*n),memset(eid,0,4*n),memset(ptr,0,4*n+4); for(int i=1,k;i<=n;i++){ k=read(),e[i].assign(k,0),Ans[i]=e[i],C=max(k,C); if(k==1) leaf.push_back(i); for(int j=0,t;je[y].size();}); // 这里会不会有什么特殊性质? while(l<=r) if(check(Q=(l+r)>>1,rt)) r=Q-1; else l=Q+1; printf("%d\n",Q=l),check(Q,rt),dfs(rt,0); for(int i=1;i<=n;puts(""),i++){printf("%d ",col[i]); for(int j:Ans[i]) printf("%d ",j);} } return 0; }