
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;//别大别笑
int s[N][N],a[N][N];
int ans;
int n,m;//判断边界
int dx[5]={0,-1,1,0,0};
int dy[5]={0,0,0,-1,1};
int dfs(int x,int y){
if(s[x][y])return s[x][y];//记忆化搜索
s[x][y]=1;//题目中答案是有包含这个点的,无论如何最小就是1,所以设为1
for(int i=1;i<=4;i++)
{ int xx=dx[i]+x;
int yy=dy[i]+y;//四个方向
if(xx>0&&yy>0&&xx<=n&&yy<=m&&a[x][y]>a[xx][yy]){//没有越界
dfs(xx,yy);
s[x][y]=max(s[x][y],s[xx][yy]+1);
}
}
return s[x][y];
}
int main() {
freopen("1.txt","r",stdin);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)cin>>a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ans=max(ans,dfs(i,j));//取最大值,更新答案
cout<<ans;
return 0;
}