using namespace std;
vector <int> g[1001];
int a[1010][1010];
int num[1010][1010],dp[1001][1001];
int n,m;
int l;
int ans=1;
int op[1100];
int pos;
void dfs(int now,int deep)
{
if(!g[now].size())
{
ans=max(ans,deep);
return;
}
for(int i=0;i<g[now].size();i++)
{
int t=g[now][i];
dfs(t,deep+1);
}
}
int main()
{
cin>>n>>m;
int maxn=0;
memset(a,0x7f,sizeof a);
int p=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
num[i][j]=++p;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
/*if(a[i][j]>maxn)
{
maxn=a[i][j];
l=num[i][j];
}*/
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]>a[i+1][j])
{
g[num[i][j]].push_back(num[i+1][j]);
}
if(a[i][j]>a[i][j+1])
{
g[num[i][j]].push_back(num[i][j+1]);
}
if(a[i][j]>a[i-1][j])
{
g[num[i][j]].push_back(num[i-1][j]);
}
if(a[i][j]>a[i][j-1])
{
g[num[i][j]].push_back(num[i][j-1]);
}
}
}
/*for(int i=1;i<=num[n][n];i++)
{
cout<<i<<": ";
for(int j=0;j<g[i].size();j++)
{
cout<<g[i][j]<<" ";
}
cout<<endl;
}*/
for(int i=1;i<=p;i++)
{
dfs(i,1);
}
//dfs(l,1);
cout<<ans;
return 0;
}