# Name: Set Kaung Lwin
# ID: 6632017
# Sec: 543


rows,columns = map(int,input().split())

image = [[] for _ in range(rows)]

for current_row in range(len(image)):
    image[current_row] = list(map(int,input().split()))

from disjointsets3 import DisjointSets
def printImage(m):
    for i in m:
        print(i)

moves =[(-1,0),(1,0),(0,1),(0,-1)] # up down right left

def isValid(tr,tc):
    return tr >= 0 and tr < rows and tc >=0 and tc < columns

def sides(r,c):
    valid_moves = []
    for (i,j) in moves:
        target_row = r+i
        target_column = c+j
        if isValid(target_row,target_column):
            valid_moves.append((target_row,target_column))

    return valid_moves




ds = DisjointSets(rows*columns)


largest = 0

for current_row in range(len(image)):
    for current_column in range(len(image[current_row])):
        if image[current_row][current_column] == 1:
            for (neighbor_row,neighbor_col) in sides(current_row,current_column):
                if image[neighbor_row][neighbor_col] == 1:
                    ds.union( ( neighbor_row*columns+neighbor_col ) , ( current_row*columns+current_column ) )

sizes = {}    
        
for current_row in range(rows):
    for current_column in range(columns):
        if image[current_row][current_column] == 1:
            representative = ds.findset(current_row*columns+current_column)
            if representative in sizes:
                sizes[representative] += 1
            else:
                sizes[representative] = 1
            largest = max(sizes[representative],largest)

print(largest)
                





    
