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

}