#include<stdio.h>
#include<string.h>
int map[101][101];
int vis[101][101];//保存的是,在遍历的过程中,最大的访问顺序
int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
int cont,row,col;
int dfs(int x,int y)
{
if(vis[x][y]>1)//这里vis[x][y]>1 说明,被访问过了;直接返回,之前访问的顺序值;
return vis[x][y];
for(int i=0;i<4;i++)
{
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if(nx>=0 && nx<row && ny>=0 && ny<col && map[x][y]<map[nx][ny])
{
cont = dfs(nx,ny);
if(vis[x][y]<cont+1)// 一次深度遍历过程中最后一个节点,开始返回
vis[x][y] = cont + 1; ///然后修改上一个点的访问顺序值;
//从后往前返回的过程中,修改访问顺序值;
//这恰好利用的递归的特点;
}
}
return vis[x][y];
}
int main()
{
int t,res,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&row,&col);
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
scanf("%d",&map[i][j]);
vis[i][j] = 1;
}
}
res = 0;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
dfs(i,j);
if(vis[i][j] > res)
res = vis[i][j];
}
}
printf("%d\n",res);
}
return 0;
}