#include<vector>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=2*1e3+5;
struct node{
bool v;
int to;
};
int n,nxt[maxn],lnxt[maxn],da,last;
char edge[maxn][maxn];
char s;
bool ce;
int main(){
cin>>n;
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
cin>>s;
edge[i][j]=s;
edge[j][i]=s;
}
}
for(int i=1;i<=n;i++){
da=i;
ce=0;
last=i;
for(int j=1;j<=n;j++){
if(j==i)continue;
if(edge[lnxt[last]][last]==edge[last][j]||(last==i)){
nxt[last]=j;
lnxt[j]=last;
last=j;
if(!ce)da=j;
}
else{
if(!ce){
nxt[last]=j;
lnxt[j]=last;
ce=1;
da=last;
last=j;
}
else if(edge[lnxt[da]][da]==edge[da][j]){
if(edge[j][nxt[da]]==edge[da][j]){
int y=nxt[da];
nxt[da]=j;
lnxt[j]=da;
da=y;
nxt[j]=da;
lnxt[da]=j;
}
else{
int y=nxt[da];
nxt[da]=j;
lnxt[j]=da;
da=j;
nxt[j]=y;
lnxt[y]=j;
}
}
else{
if(edge[lnxt[da]][j]==edge[lnxt[da]][da]){
int y=da;
nxt[lnxt[da]]=j;
lnxt[j]=lnxt[da];
da=j;
nxt[j]=y;
lnxt[y]=j;
}
else{
int y=da;
nxt[lnxt[da]]=j;
lnxt[j]=lnxt[da];
da=lnxt[da];
if(da==i)ce=0;
nxt[j]=y;
lnxt[y]=j;
}
}
}
}
cout<<n<<'\n'<<i<<' ';
for(int j=nxt[i];j;j=nxt[j])cout<<j<<' ';
cout<<'\n';
memset(nxt,0,sizeof(nxt));
memset(lnxt,0,sizeof(lnxt));
}
}