#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<vector<long long> > a;
vector<long long> sum[2];
struct M {
  long long v[4] = {0};
  void init() { memset(v, 0, sizeof(v)); }
  void push(long long x) {
    for (int i = 0; i < 4; ++i)
      if (x > v[i]) swap(x, v[i]);
  }
  long long sum(int x) {
    long long ret = 0;
    for (int i = 0; i < x; ++i) ret += v[i];
    return ret;
  }
} _m;
int main() {
  scanf("%d %d", &n, &m);
  if (n < m) {
    swap(n, m);
    a.resize(n, vector<long long>(m));
    for (int i = 0; i < m; ++i)
      for (int j = 0; j < n; ++j) scanf("%lld", &a[j][i]);
  } else {
    a.resize(n, vector<long long>(m));
    for (int i = 0; i < n; ++i)
      for (int j = 0; j < m; ++j) scanf("%lld", &a[i][j]);
  }
  sum[0] = vector<long long>(n, 0);
  sum[1] = vector<long long>(m, 0);
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j) sum[0][i] += a[i][j], sum[1][j] += a[i][j];
  long long ans = 0;
  for (int i = 0; i < m; ++i)
    for (int j = i + 1; j < m; ++j) {
      _m.init();
      for (int k = 0; k < n; ++k) {
        long long _sum = sum[0][k] - a[k][i] - a[k][j];
        _m.push(_sum);
      }
      ans = max(ans, sum[1][i] + sum[1][j] + _m.sum(2));
    }
  for (int i = 0; i < m; ++i) {
    _m.init();
    for (int j = 0; j < n; ++j) _m.push(sum[0][j] - a[j][i]);
    ans = max(ans, _m.sum(3) + sum[1][i]);
  }
  for (int i = 0; i < n; ++i) {
    _m.init();
    for (int j = 0; j < m; ++j) _m.push(sum[1][j] - a[i][j]);
    ans = max(ans, _m.sum(3) + sum[0][i]);
  }
  _m.init();
  for (int i = 0; i < n; ++i) _m.push(sum[0][i]);
  ans = max(ans, _m.sum(4));
  _m.init();
  for (int i = 0; i < m; ++i) _m.push(sum[1][i]);
  ans = max(ans, _m.sum(4));
  printf("%lld\n", ans);
}
