# 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)