#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> dp(100,vector(100,1));//动态规划
vector<vector<int>> graph(100,vector(100,1));
void dfs(int n,int m,int row,int col);
int main() {
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>graph[i][j];
}
}
//使用深度优先填充dp,维护最大值
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
dfs(n,m,i,j);
ans=max(ans,dp[i][j]);
}
}
cout<<ans;
return 0;
//
}
//深度优先搜索
void dfs(int n,int m,int row,int col){
//上
if(row-1>=0 && graph[row-1][col]<graph[row][col]){
dfs(n,m,row-1,col);
dp[row][col]=max(dp[row-1][col]+1,dp[row][col]);
}
//下
if(row+1<n && graph[row+1][col]<graph[row][col]){
dfs(n,m,row+1,col);
dp[row][col]=max(dp[row+1][col]+1,dp[row][col]);
}
//左
if(col-1>=0 && graph[row][col-1]<graph[row][col]){
dfs(n,m,row,col-1);
dp[row][col]=max(dp[row][col-1]+1,dp[row][col]);
}
//右
if(col+1<m && graph[row][col+1]<graph[row][col]){
dfs(n,m,row,col+1);
dp[row][col]=max(dp[row][col+1]+1,dp[row][col]);
}
}
// 64 位输出请用 printf("%lld")