from disjointsets3 import DisjointSets
import time
 
 
def get_neighbors(x, y, image):
    neighbors = []
    if ((x-1) in range(M)) and image[x-1][y] == 1:
        neighbors.append(((x-1)*N)+y)
    if ((x+1) in range(M)) and image[x+1][y] == 1:
        neighbors.append(((x+1)*N)+y)
    if ((y-1) in range(N)) and image[x][y-1] == 1:
        neighbors.append((x*N)+(y-1))
    if ((y+1) in range(N)) and image[x][y+1] == 1:
        neighbors.append((x*N)+(y+1))
 
    return neighbors
 
 
st = time.process_time()
M, N = map(int, input().split())
image = [list(map(int, input().split())) for _ in range(M)]
S = DisjointSets(M*N)
clouds = []
 
for x in range(len(image)):
    for y in range(len(image[x])):
        if image[x][y] == 1:
            coordinate = (x*N)+y
            clouds.append(coordinate)
            neighbors = get_neighbors(x, y, image)
            for n in neighbors:
                S.union(coordinate, n)
 
et = time.process_time()
print(et - st)
sizes = {}
largest = 0


for current_row in range(M):
    for current_column in range(N):
        if image[current_row][current_column] == 1:
            representative = S.findset(current_row*N+current_column)
            if representative in sizes:
                sizes[representative] += 1
            else:
                sizes[representative] = 1
            largest = max(sizes[representative],largest)

print(largest)