#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")