#include<cstring>
#include<algorithm>
using namespace std ;
int MAX ;
int sum , m = 1 ;
int R , C ;//区域的行数R和列数C
int map[4000][4000] ;
int opt[4000][4000] ;
int Move[4][2] = { {0 , 1} ,
{1 , 0} ,
{0 , -1} ,
{-1 , 0} } ;
void dfs( int x , int y ){
if (opt[x][y] > 0) return;
opt[x][y] = 1 ;
for ( int k = 0 ; k <= 3 ; k++ )
{
int tx = x + Move[k][0] ;
int ty = y + Move[k][1] ;
if ( map[x][y] > map[tx][ty] && tx > 0 && tx <= R && ty > 0 && ty <= C ){
dfs(tx , ty) ;
opt[x][y] = max ( opt[x][y] , opt[tx][ty] + 1 ) ;
}
}
}
int main(){
int i , j ;
cin >> R >> C ;
for ( i = 1 ;i <= R ; i++ )
for ( j = 1 ; j <= C ; j++ )
cin >> map[i][j] ;
for ( i = 1 ;i <= R ; i++ )
for ( j = 1 ; j <= C ; j++ ){
dfs(i , j) ;
MAX = max ( MAX , opt[i][j] ) ;
}
cout << MAX ;
return 0 ;
}