#include<iostream>
#include<string>
#include<memory.h>
using namespace std;
char m[80][80];
enum Direction{Right=1,Up,Left,Down};
int calculr(int n)
{
int r=1;
while(true)
{
if(n<=r*r&&n>(r-1)*(r-1))
break;
else
r++;
}
return r;
}
void PrintMatrix(string& s)
{
memset(m,0,sizeof(m));
int r=calculr(s.size());
int x,y;
int cnt=0;
if(r%2)
{
x=(r+1)/2;y=(r+1)/2;
}else{
x=r/2+1;y=r/2;
}//起点坐标
Direction direction=Right;
m[x][y]=s[cnt];
int step=1;
while(cnt<s.size())
{
switch(direction)
{
case Right:{
for(int i=0;i<step&&cnt<s.size();i++)
{
m[x][++y]=s[++cnt];
}
direction=Up;
break;
};
case Up:{
for(int i=0;i<step&&cnt<s.size();i++)
{
m[--x][y]=s[++cnt];
}
step++;
direction=Left;
break;
};
case Left:{
for(int i=0;i<step&&cnt<s.size();i++)
{
m[x][--y]=s[++cnt];
}
direction=Down;
break;
};
case Down:{
for(int i=0;i<step&&cnt<s.size();i++)
{
m[++x][y]=s[++cnt];
}
step++;
direction=Right;
break;
};
default:
break;
}
}//填充部分
for(int i=1;i<=r;i++)
{
if(i==r||i==1)
{
bool flag=true;
for(int j=1;j<=r;j++)
{
if(m[i][j])//有字母
{
flag=false;
break;
}//若一行一直没有字母,则为true
}//第一行和最后一行要考虑特殊情况
if(flag)
continue;
}
for(int j=1;j<=r;j++)
{
if(m[i][j])
cout<<m[i][j];
else
cout<<" ";
}
cout<<endl;
}
cout<<endl;
}
int main()
{
int T;
cin>>T;
for(int i=0;i<T;i++)
{
string s;
cin>>s;
PrintMatrix(s);
}
return 0;
}