#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int MAXN = 1e5 + 10;
const long long oo = 1LL << 60;
long long r[MAXN] = {}, c[MAXN] = {};
int N, M;
long long ans;
vector<vector<int>> arr;
vector<pair<long long, int>> row, col;
int main(int argv, char **argc) {
  cin.tie(0);
  ios::sync_with_stdio(0);
  cin >> N >> M;
  arr.assign(N, vector<int>(M, 0));
  for (int i = 0; i < N; ++i) {
    for (int j = 0; j < M; ++j) {
      cin >> arr[i][j];
      r[i] += arr[i][j];
      c[j] += arr[i][j];
    }
  }
  for (int i = 0; i < N; ++i) {
    row.push_back(make_pair(r[i], i));
  }
  for (int i = 0; i < M; ++i) {
    col.push_back(make_pair(c[i], i));
  }
  ans = 0;
  auto cmp = [](const pair<long long, int> &one,
                const pair<long long, int> &two) -> bool {
    return one.first > two.first;
  };
  partial_sort(row.begin(), row.begin() + min(4, (int)row.size()), row.end(),
               cmp);
  partial_sort(col.begin(), col.begin() + min(4, (int)col.size()), col.end(),
               cmp);
  long long ans1 = 0, ans2 = 0;
  for (int i = 0; i < min(N, 4); ++i) {
    ans1 += row[i].first;
  }
  for (int i = 0; i < min(M, 4); ++i) {
    ans2 += col[i].first;
  }
  ans1 = max(ans1, ans2);
  int T = min(4, N * M);
  while (T--) {
    auto p1 = max_element(row.begin(), row.end());
    auto p2 = max_element(col.begin(), col.end());
    long long rs = p1->first, cs = p2->first;
    int I = p1->second, J = p2->second;
    if (rs > cs) {
      ans += rs;
      for (int i = 0; i < M; ++i) {
        col[i].first -= arr[I][col[i].second];
      }
      p1->first = -oo;
    } else {
      ans += cs;
      for (int i = 0; i < N; ++i) {
        row[i].first -= arr[row[i].second][J];
      }
      p2->first = -oo;
    }
  }
  cout << max(ans, ans1) << '\n';
}
