#include <bits/stdc++.h>
using namespace std;
int num[101][101];
int ans[101][101];
int max(int a,int b)
{
return a>b?a:b;
}
int Row,Col;
int dfs(int row,int col){
if (ans[row][col]) return ans[row][col];
int r=row,c=col,m=-1;
if (num[row][col]>num[row-1][col] && row>=2)
{
if (m<num[row-1][col])
{
m=num[row-1][col];
r=row-1;
}
}
if (num[row][col]>num[row+1][col] && row+1<=Row)
{
if (m<num[row+1][col])
{
m=num[row+1][col];
r=row+1;
}
}
if (num[row][col]>num[row][col-1] && col>=2)
{
if (m<num[row][col-1])
{
m=num[row][col-1];
r=row;
c=col-1;
}
}
if (num[row][col]>num[row][col+1] && col+1<=Col)
{
if (m<num[row][col+1])
{
m=num[row][col+1];
r=row;
c=col+1;
}
}
if (m==-1)
{
ans[row][col]=1;
return ans[row][col];
}
ans[row][col]=dfs(r,c)+1;
return ans[row][col];
}
int main(){
cin>>Row>>Col;
for (int i=0;i<=100;i++)
{
for (int j=0;j<=100;j++)
{
num[i][j]=0;
}
}
for (int i=1;i<=Row;i++)
{
for (int j=1;j<=Col;j++)
{
scanf("%d",&num[i][j]);
}
}
for (int i=1;i<=Row;i++)
{
for (int j=1;j<=Col;j++)
{
dfs(i,j);
}
}
int a=0;
for (int i=1;i<=Row;i++)
{
for (int j=1;j<=Col;j++)
{
a=max(a,ans[i][j]);
}
}
cout<<a;
return 0;
}