#include<bits/stdc++.h>
using namespace std;
int r,c,f=0;
int dp[110][110];
int n[110][110];
struct gz{
int h;
int x,y;
}gq[10010];
int a[5]={0,1,-1,0,0};
int b[5]={0,0,0,1,-1};
bool cmp(gz a,gz b)
{
return a.h<b.h;
}
int main()
{
memset(n,0,sizeof(n));
memset(dp,0,sizeof(dp));
cin>>r>>c;
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
dp[i][j]=1;
f++;
cin>>gq[f].h;
n[i][j]=gq[f].h;
gq[f].x=i;
gq[f].y=j;
}
}
sort(gq+1,gq+f+1,cmp);
for(int i=1;i<=f;i++)
{
for(int j=1;j<=4;j++){
int nx=gq[i].x;
int ny=gq[i].y;
if(n[nx][ny]<n[nx+a[j]][ny+b[j]])
{
if(nx+a[j]>0&&nx+a[j]<=r&&ny+b[j]>0&&ny+b[j]<=c)
dp[nx+a[j]][ny+b[j]]=max(dp[nx][ny]+1,dp[nx+a[j]][ny+b[j]]);
}
}
}
int ans=-1;
for(int i=1;i<=f;i++)
ans=max(ans,dp[gq[f].x][gq[f].y]);
cout<<ans;
return 0;
}