# Topic : Graph _ 연구소
#
# Python 3 : 3972ms

from collections import deque
import copy
from itertools import combinations
import sys

def bfs(x,y):
  dx = [-1,1,0,0]
  dy = [0,0,-1,1]

  queue = deque()
  queue.append((x,y))  
  
  while queue:
    x , y = queue.popleft();

    for i in range(4):
      nx = x + dx[i]
      ny = y + dy[i]

      if nx < 0 or nx >= N or ny < 0 or ny >= M:
        continue

      if tmp[nx][ny] == 0:
        tmp[nx][ny] = 2
        queue.append((nx,ny))

N , M = map(int,sys.stdin.readline().split())

graph = []
for _ in range(N):
  graph.append(list(map(int,input().split())))

#  1. find 2(virus) location
virus_idx = []
air_idx = []
for i in range(N):
  for j in range(M):
    if graph[i][j] == 2:
      virus_idx.append((i,j))
    elif graph[i][j] == 0:
      air_idx.append((i,j))

# 2. 무작정 모든 경우를 생각해본다?
comb_air_idx = list(combinations(air_idx,3))

max = 0
count = 0
for cai in comb_air_idx:

  # 1. make tmp 
  tmp = copy.deepcopy(graph)

  # 2. tmp 에 해당하는 comb_idx를 1로 변경
  for idx in cai:
    tmp[idx[0]][idx[1]] = 1

  # 3. 각각의 virus에 대해 확산 수행
  for vi in virus_idx:
    bfs(vi[0],vi[1])

  
  # 4. 0의 개수가 최대인 경우 찾기  
  sum = 0
  for t in tmp:
    sum += t.count(0)
  
  if sum > max :
    max = sum
  
  # if count == 1:
  #   break 
  # count += 1

print(max)