#include<cstdio>
#include<vector>
#include<queue>
#include<utility>
#include<cmath>
using namespace std;
typedef vector<int> VI;
VI imap[8];
int row, col; // global var
int dr[] = { 0, 0, -1, 1 };
int dc[] = { -1, 1 ,0, 0 };
int virus_bfs(VI dfsmap[]) {
queue<pair<int, int> > Q;
for (int r = 0; r < row; r++) {
for (int c = 0; c < col; c++) {
if (dfsmap[r][c] == 2) Q.push(make_pair(r, c));
}
}
while (!Q.empty()) {
pair<int, int> here = Q.front(); Q.pop();
int here_row = here.first;
int here_col = here.second;
for (int i = 0; i < 4; i++) {
if (0 <= here_row + dr[i] && here_row + dr[i] < row &&
0 <= here_col + dc[i] && here_col + dc[i] < col) {
if (dfsmap[here_row + dr[i]][here_col + dc[i]] == 0) {
dfsmap[here_row + dr[i]][here_col + dc[i]] = 2;
Q.push(make_pair(here_row + dr[i], here_col + dc[i]));
}
}
}
}
int ans = 0;
for (int r = 0; r < row; r++) {
for (int c = 0; c < col; c++) {
if (dfsmap[r][c] == 0) ans++;
}
}
return ans;
} // 과정 2: 벽을 3개 생성을 완료한 후 바이러스를 퍼트림
// 과정 3: 과정1-2를 거친 후 안전영역의 수
int dfs(int rrow, int ccol, int n_wall, VI dfsmap[]) {
int ret = 0;
if (n_wall == 3) {
VI bfsmap[8];
for (int r = 0; r < row; r++) {
bfsmap[r].resize(col);
for (int c = 0; c < col; c++) {
bfsmap[r][c] = dfsmap[r][c];
}
}
return virus_bfs(bfsmap);
}
int r = rrow;
int c = ccol;
for (; r < row; r++) {
if (r != rrow) c = 0;
for (; c < col; c++) {
if (dfsmap[r][c] == 0) {
dfsmap[r][c] = 1;
ret = max(ret,dfs(r, c, n_wall + 1, dfsmap));
dfsmap[r][c] = 0;
}
}
}
return ret;
} // 과정 1: map에 벽을 생성 모든 경우의 수
int main() {
scanf("%d%d", &row, &col);
for (int r = 0; r < row; r++) {
imap[r].resize(col);
for (int c = 0; c < col; c++) {
scanf("%d", &imap[r][c]);
}
}
int ans = 0;
for (int r = 0; r < row; r++) {
for (int c = 0; c < col; c++) {
if (imap[r][c] == 0) {
imap[r][c] = 1;
ans = max(ans, dfs(r, c, 1, imap));
imap[r][c] = 0;
}
}
}
printf("%d", ans);
return 0;
}