#include <bits/stdc++.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#define re register
#define sq volatile signed new operator private public protected auto enum mutable explicit export extern static constexpr const register unsigned long long short int N = 1e9+10;
#define endl '\n'
#define ri register int
#define rep(i,a,b) for(register int i = (a);i<=(b);++i)
#define REP(i,a,b,c) for(register int i = (a);i<=(b);i+=c)
#define _for(i,a,n) for (register int i = (a); i < (n); ++i)
#define _rep(i,a,n) for (register int i = (a); i <= (n); ++i)
#define _per(i,n,a) for (register int i = (n); i >= (a); --i)
#define it iterator
#define reit reverse_iterator
#define ll long long
#define DB double
#define map mp
using namespace std;
const int maxn = 2147483647;
const int N =500;
int dx[5] = {0,0,1,-1};
int dy[5] = {1,-1,0,0};
int map[N][N];
int step[N][N];
inline int dfs(int x,int y){
if(step[x][y]) return step[x][y];
step[x][y]=1;
for(int i=0;i<4;++i){
int xx = x+dx[i],yy =y+dy[i];
if(map[xx][yy]<map[x][y]){
step[x][y]= max(step[x][y],dfs(xx,yy)+1);
}
}
return step[x][y];
}
signed main(){
int n,m;
cin >>n>>m;
for(int i =0;i<=n+1;++i){
map[i][0] =map[i][n+1] = maxn;
}
for(int i =0;i<=m+1;++i){
map[0][i] = map[m+1][i] = maxn;
}
for(int i =1;i<=n;++i){
for(int j =1;j<=m;++j){
cin >>map[i][j];
}
}
int ans =0;
for(int i =1;i<=n;++i){
for(int j =1;j<=m;++j){
ans = max(ans,dfs(i,j));
}
}
cout <<ans;
return 0;
}