#include<bits/stdc++.h>
using namespace std;
const int N = 5010;
int mp[N][N];
int dp[N][N];
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int n,m;
int dfs(int x,int y,int cnt){
if(dp[x][y]) return dp[x][y];
bool flag = false;
for(int i = 0;i<4;i++){
int dx = x+dir[i][0];
int dy = y+dir[i][1];
if(mp[dx][dy]<mp[x][y]){
flag = true;
}
}
if(!flag) return dp[x][y];
else{
int maxx = dp[x][y];
bool flag = false;
for(int i = 0;i<4;i++){
int dx = x+dir[i][0];
int dy = y+dir[i][1];
if(dx<1||dy<1||dx>n||dy>m) continue;
if(mp[dx][dy]>mp[x][y]){
flag = true;
maxx = max(dfs(dx,dy,cnt+1),maxx);
}
}
if(flag){
dp[x][y] = maxx+1;
}
else{
dp[x][y] = dp[x][y];
}
return dp[x][y];
}
}
int main(){
cin >> n >> m;
int maxx = 0;
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
cin >> mp[i][j];
if(mp[i][j]>maxx){
maxx = mp[i][j];
}
}
}
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
dfs(i,j,1);
}
}
int maxn = 0;
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
maxn = max(maxn,dp[i][j]);
}
}
cout << maxn + 1 << endl;
return 0;
}