#include<iostream>
#include<limits.h>
using namespace std;
struct heapnode
{
int element;
int r;
int c;
};
class heap
{
public:
struct heapnode *harr;
int heapsize;
int capacity;
heap(int n)
{
harr = new heapnode[n];
heapsize = 0;
capacity = n;
}
void minheapify(int i)
{
int smallest=i,lchild,rchild;
while(1)
{
lchild = 2*i + 1;
rchild = 2*i + 2;
if(lchild<heapsize && harr[smallest].element > harr[lchild].element )
smallest = lchild;
if(rchild<heapsize && harr[smallest].element > harr[rchild].element)
smallest = rchild;
if(smallest!=i)
{
swap(harr[i],harr[smallest]);
i = smallest;
}
else
break;
}
}
void buildheap(int n)
{
heapsize = n;
for(int i=heapsize/2 -1;i>=0;i--)
minheapify(i);
}
};
void printSortedMatrix(int **arr,int m,int n)
{
int k=m;
int i,j;
heap H(m);
struct heapnode hr;
int count =0;
while(1)
{
//cout<<count<<endl;
if(count < k-1)
{
//cout<<count<<" "<<k<<endl;
H.harr[count] = {arr[count][0],count,0};
}
else
{
if(count==k-1)
{
H.harr[count] = {arr[count][0],count,0};
H.buildheap(k);
}
if(H.harr[0].element==999)
break;
cout<<H.harr[0].element<<" ";
hr = H.harr[0];
if(hr.c==n)
H.harr[0] = {999,0,0};
else
H.harr[0] = {arr[hr.r][hr.c+1],hr.r,hr.c+1};
H.minheapify(0);
}
count++;
}
cout<<endl;
}
int main()
{
//code
int t,N,**arr,i,j,M;
cin>>t;
while(t--)
{
cin>>M;
N = M;
arr = new int*[M];
for(i=0;i<M;i++)
arr[i] = new int[N];
for(i=0;i<M;i++)
for(j=0;j<N;j++)
cin>>arr[i][j];
printSortedMatrix(arr,M,N);
}
return 0;
}
ICAgICNpbmNsdWRlPGlvc3RyZWFtPgogICAgI2luY2x1ZGU8bGltaXRzLmg+CiAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgCiAgICBzdHJ1Y3QgaGVhcG5vZGUKICAgIHsKICAgICAgICBpbnQgZWxlbWVudDsKICAgICAgICBpbnQgcjsKICAgICAgICBpbnQgYzsKICAgIH07CiAgICBjbGFzcyBoZWFwCiAgICB7CiAgICBwdWJsaWM6CiAgICAgICAgc3RydWN0IGhlYXBub2RlICpoYXJyOwogICAgICAgIGludCBoZWFwc2l6ZTsKICAgICAgICBpbnQgY2FwYWNpdHk7CiAgICAKICAgICAgICBoZWFwKGludCBuKQogICAgICAgIHsKICAgICAgICAgICAgaGFyciA9IG5ldyBoZWFwbm9kZVtuXTsKICAgICAgICAgICAgaGVhcHNpemUgPSAwOwogICAgICAgICAgICBjYXBhY2l0eSA9IG47CiAgICAgICAgfQogICAgICAgIHZvaWQgbWluaGVhcGlmeShpbnQgaSkKICAgICAgICB7CiAgICAgICAgICAgIGludCBzbWFsbGVzdD1pLGxjaGlsZCxyY2hpbGQ7CiAgICAgICAgICAgIHdoaWxlKDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxjaGlsZCA9IDIqaSArIDE7CiAgICAgICAgICAgICAgICByY2hpbGQgPSAyKmkgKyAyOwogICAgICAgICAgICAgICAgaWYobGNoaWxkPGhlYXBzaXplICYmIGhhcnJbc21hbGxlc3RdLmVsZW1lbnQgPiBoYXJyW2xjaGlsZF0uZWxlbWVudCApCiAgICAgICAgICAgICAgICAgICAgc21hbGxlc3QgPSBsY2hpbGQ7CiAgICAgICAgICAgICAgICBpZihyY2hpbGQ8aGVhcHNpemUgJiYgaGFycltzbWFsbGVzdF0uZWxlbWVudCA+IGhhcnJbcmNoaWxkXS5lbGVtZW50KQogICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0ID0gcmNoaWxkOwogICAgICAgICAgICAgICAgaWYoc21hbGxlc3QhPWkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3dhcChoYXJyW2ldLGhhcnJbc21hbGxlc3RdKTsKICAgICAgICAgICAgICAgICAgICBpID0gc21hbGxlc3Q7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdm9pZCBidWlsZGhlYXAoaW50IG4pCiAgICAgICAgewogICAgICAgICAgICBoZWFwc2l6ZSA9IG47CiAgICAgICAgICAgIGZvcihpbnQgaT1oZWFwc2l6ZS8yIC0xO2k+PTA7aS0tKQogICAgICAgICAgICAgICAgbWluaGVhcGlmeShpKTsKICAgICAgICB9CiAgICB9OwogICAgdm9pZCBwcmludFNvcnRlZE1hdHJpeChpbnQgKiphcnIsaW50IG0saW50IG4pCiAgICB7CiAgICAgICAgaW50IGs9bTsKICAgICAgICBpbnQgaSxqOwogICAgICAgIGhlYXAgSChtKTsKICAgICAgICBzdHJ1Y3QgaGVhcG5vZGUgaHI7CiAgICAgICAgaW50IGNvdW50ID0wOwogICAgICAgIHdoaWxlKDEpCiAgICAgICAgewogICAgICAgICAgICAvL2NvdXQ8PGNvdW50PDxlbmRsOwogICAgICAgICAgICBpZihjb3VudCA8IGstMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9jb3V0PDxjb3VudDw8IiAiPDxrPDxlbmRsOwogICAgICAgICAgICAgICAgSC5oYXJyW2NvdW50XSA9IHthcnJbY291bnRdWzBdLGNvdW50LDB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoY291bnQ9PWstMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBILmhhcnJbY291bnRdID0ge2Fycltjb3VudF1bMF0sY291bnQsMH07CiAgICAgICAgICAgICAgICAgICAgSC5idWlsZGhlYXAoayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZihILmhhcnJbMF0uZWxlbWVudD09OTk5KQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAKICAgICAgICAgICAgICAgIGNvdXQ8PEguaGFyclswXS5lbGVtZW50PDwiICI7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGhyID0gSC5oYXJyWzBdOwogICAgICAgICAgICAgICAgaWYoaHIuYz09bikKICAgICAgICAgICAgICAgICAgICBILmhhcnJbMF0gPSB7OTk5LDAsMH07CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgSC5oYXJyWzBdID0ge2Fycltoci5yXVtoci5jKzFdLGhyLnIsaHIuYysxfTsKICAgICAgICAgICAgICAgIEgubWluaGVhcGlmeSgwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb3VudCsrOwogICAgICAgIH0KICAgICAgICBjb3V0PDxlbmRsOwogICAgfQogICAgCiAgICBpbnQgbWFpbigpCiAgICAgewogICAgCS8vY29kZQogICAgICAgIGludCB0LE4sKiphcnIsaSxqLE07CiAgICAgICAgY2luPj50OwogICAgICAgIHdoaWxlKHQtLSkKICAgICAgICB7CiAgICAgICAgICAgIGNpbj4+TTsKICAgICAgICAgICAgTiA9IE07CiAgICAgICAgICAgIGFyciA9IG5ldyBpbnQqW01dOwogICAgICAgICAgICBmb3IoaT0wO2k8TTtpKyspCiAgICAgICAgICAgICAgICBhcnJbaV0gPSBuZXcgaW50W05dOwogICAgICAgICAgICBmb3IoaT0wO2k8TTtpKyspCiAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8TjtqKyspCiAgICAgICAgICAgICAgICAgICAgY2luPj5hcnJbaV1bal07CiAgICAgICAgICAgIHByaW50U29ydGVkTWF0cml4KGFycixNLE4pOwogICAgICAgIH0KICAgIAlyZXR1cm4gMDsKICAgIH0K