#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int n;
int a[N];
int f[N];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
int m;
int dfs(int x,int y)
{
if(f[(x-1)*m+y])
{
return f[(x-1)*m+y];
}
int ans = 0;
for(int i = 0;i<4;i++)
{
int r = dx[i]+x,c = dy[i]+y;
if(r<=n&&c<=m&&r>=1&&c>=1&&a[(x-1)*m+y]<a[(r-1)*m+c])
{
ans = max(dfs(r,c)+1,ans);
}
}
return f[(x-1)*m+y] = ans;
}
int main()
{
int _;
scanf("%d",&_);
while(_--)
{
scanf("%d %d",&n,&m);
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
scanf("%d",&a[(i-1)*m+j]);
}
}
int maxx = 0;
int maxxx = 0;
memset(f,0,sizeof(f));
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
int t = dfs(i,j);
if(maxx<t||maxx == t&&a[(i-1)*m+j]<a[maxxx])
{
maxx = t;
maxxx = (i-1)*m+j;
}
}
}
printf("%d\n",maxx+1);
set<int>cd;
cd.insert(a[maxxx]);
int x = maxxx%m == 0?maxxx/m:maxxx/m+1,y = maxxx%m == 0?m:maxxx%m;\
while(f[(x-1)*m+y])
{
int minn = 1e9;
int minnr = 0;
int minnc = 0;
for(int i = 0;i<4;i++)
{
int r = x+dx[i],c = y+dy[i];
if(r<1||r>n||c<1||c>m)
{
continue;
}
if(f[(r-1)*m+c] == f[(x-1)*m+y]-1&&a[(x-1)*m+y]<a[(r-1)*m+c])
{
if(minn>a[(r-1)*m+c])
{
minn = a[(r-1)*m+c];
minnr = r;
minnc = c;
}
}
}
x = minnr;
y = minnc;
cd.insert(minn);
}
for(auto it = cd.begin();it!=cd.end();it++)
{
printf("%d ",*it);
}
printf("\n");
}
return 0;
}