#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define fi first
#define se second
#define mp make_pair
#define all(cont) cont.begin(), cont.end()
class Graph
{
public:
ll **pond;
bool **visited;
ll **comp;
ll COLOR;
ll n;
ll m;
void init()
{
cin >> n >> m;
pond = new ll*[n];
comp = new ll*[n];
visited = new bool*[n];
for (ll i = 0; i < n; i++)
{
pond[i] = new ll[m];
visited[i] = new bool[m];
comp[i] = new ll[m];
for (ll j = 0; j < m; j++)
{
comp[i][j] = -1;
visited[i][j] = false;
cin >> pond[i][j];
}
}
COLOR = 0;
for (ll i = 0; i < n; i++)
{
for (ll j = 0; j < m; j++)
{
if (pond[i][j] != 0 && !visited[i][j])
{
COLOR++;
bfs(i, j);
}
}
}
ll ans = 0;
for (ll i = 0; i < n; i++)
{
for (ll j = 0; j < m; j++)
{
if (pond[i][j] == 0)
{
unordered_set<ll>included;
ll curr = 0;
if (i > 0 && included.find(comp[i - 1][j]) == included.end())
{
included.insert(comp[i-1][j]);
curr += pond[i - 1][j];
}
if (i < n - 1 && included.find(comp[i + 1][j]) == included.end())
{
included.insert(comp[i+1][j]);
curr += pond[i + 1][j];
}
if (j > 0 && included.find(comp[i][j - 1]) == included.end())
{
included.insert(comp[i][j-1]);
curr += pond[i][j - 1];
}
if (j < m - 1 && included.find(comp[i][j + 1]) == included.end())
{
included.insert(comp[i][j+1]);
curr += pond[i][j + 1];
}
// cout<<i<<" "<<j<<" "<<curr<<endl;
ans = max(ans, curr);
}
}
}
cout << ans << endl;
}
void bfs(ll srcx, ll srcy)
{
queue<pair<ll, ll>>q;
q.push(mp(srcx, srcy));
visited[srcx][srcy] = true;
pair<ll, ll>curr;
vector<pair<ll, ll>>forsizecolor;
ll size = 0;
while (!q.empty())
{
curr = q.front();
q.pop();
size++;
forsizecolor.pb(curr);
if (curr.fi < n - 1 && pond[curr.fi + 1][curr.se] != 0 && !visited[curr.fi + 1][curr.se])
{
visited[curr.fi + 1][curr.se] = true;
q.push(mp(curr.fi + 1, curr.se));
}
if (curr.fi > 0 && pond[curr.fi - 1][curr.se] != 0 && !visited[curr.fi - 1][curr.se])
{
visited[curr.fi - 1][curr.se] = true;
q.push(mp(curr.fi - 1, curr.se));
}
if (curr.se < n - 1 && pond[curr.fi][curr.se + 1] != 0 && !visited[curr.fi][curr.se + 1])
{
visited[curr.fi][curr.se + 1] = true;
q.push(mp(curr.fi, curr.se + 1));
}
if (curr.se > 0 && pond[curr.fi][curr.se - 1] != 0 && !visited[curr.fi][curr.se - 1])
{
visited[curr.fi][curr.se - 1] = true;
q.push(mp(curr.fi, curr.se - 1));
}
}
for (auto it : forsizecolor)
{
comp[it.fi][it.se] = COLOR;
pond[it.fi][it.se] = size;
}
// for(ll i=0;i<n;i++)
// {
// for(ll j=0;j<m;j++)
// cout<<comp[i][j]<<" ";
// cout<<endl;
// }
// cout<<endl;
}
};
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
Graph G;
G.init();
return 0;
}