package main
import "fmt"
var direction = [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}
func main() {
var M, N int
fmt.Scanln(&N, &M)
sea := make([][]int, N)
visited := make([][]bool, N)
for i := 0; i < N; i++ {
sea[i] = make([]int, M)
visited[i] = make([]bool, M)
}
for i := 0; i < N; i++ {
for j := 0; j < M; j++ {
fmt.Scan(&sea[i][j])
}
}
result := 0
for i := 0; i < N; i++ {
for j := 0; j < M; j++ {
if sea[i][j] == 1 && !visited[i][j] {
area := bfs(i, j, &sea, &visited)
if area>result{
result = area
}
}
}
}
fmt.Println(result)
}
func bfs(i, j int, sea *[][]int, visited *[][]bool) int {
queue := make([][2]int, 0)
queue = append(queue, [2]int{i, j})
(*visited)[i][j] = true
area := 0
for len(queue) != 0 {
pos := queue[0]
for i := 0; i < 4; i++ {
newX := pos[0] + direction[i][0]
newY := pos[1] + direction[i][1]
if newX < 0 || newX >= len(*sea) || newY < 0 || newY >= len((*sea)[0]) {
continue
}
if (*sea)[newX][newY] == 1 && !(*visited)[newX][newY] {
queue = append(queue, [2]int{newX, newY})
(*visited)[newX][newY] = true
}
}
queue = queue[1:]
area += 1
}
return area
}