#include <bits/stdc++.h>
using namespace std;
long long n, m, ans, a[100005], b[100005], row[100005], column[100005];
long long g(long long x, long long y) { return (x - 1) * m + y; }
priority_queue<long long, vector<long long>, greater<long long> > q;
void solve1() {
  long long i, sum = 0, val;
  for (i = 1; i <= n; i++) {
    val = row[i];
    if (q.size() < 4)
      q.push(val);
    else {
      if (val > q.top()) {
        q.pop();
        q.push(val);
      }
    }
  }
  while (q.size()) {
    sum += q.top();
    q.pop();
  }
  ans = max(ans, sum);
}
void solve2() {
  long long i, sum = 0, val;
  for (i = 1; i <= m; i++) {
    val = column[i];
    if (q.size() < 4)
      q.push(val);
    else {
      if (val > q.top()) {
        q.pop();
        q.push(val);
      }
    }
  }
  while (q.size()) {
    sum += q.top();
    q.pop();
  }
  ans = max(ans, sum);
}
void solve3() {
  long long i, j, sum, val;
  for (i = 1; i <= n; i++) {
    sum = row[i];
    for (j = 1; j <= m; j++) {
      val = column[j] - a[g(i, j)];
      if (q.size() < 3)
        q.push(val);
      else {
        if (val > q.top()) {
          q.pop();
          q.push(val);
        }
      }
    }
    while (q.size()) {
      sum += q.top();
      q.pop();
    }
    ans = max(ans, sum);
  }
}
void solve4() {
  long long i, j, sum, val;
  for (i = 1; i <= m; i++) {
    sum = column[i];
    for (j = 1; j <= n; j++) {
      val = row[j] - a[g(j, i)];
      if (q.size() < 3)
        q.push(val);
      else {
        if (val > q.top()) {
          q.pop();
          q.push(val);
        }
      }
    }
    while (q.size()) {
      sum += q.top();
      q.pop();
    }
    ans = max(ans, sum);
  }
}
void solve5() {
  long long i, j, k, sum, val;
  for (i = 1; i <= n; i++) {
    for (j = i + 1; j <= n; j++) {
      sum = row[i] + row[j];
      for (k = 1; k <= m; k++) {
        val = column[k] - a[g(i, k)] - a[g(j, k)];
        if (q.size() < 2)
          q.push(val);
        else {
          if (q.top() < val) {
            q.pop();
            q.push(val);
          }
        }
      }
      while (q.size()) {
        sum += q.top();
        q.pop();
      }
      ans = max(ans, sum);
    }
  }
}
int main() {
  long long i, j, x;
  cin >> n >> m;
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++) cin >> b[g(i, j)];
  if (n > m) {
    for (i = 1; i <= n; i++)
      for (j = 1; j <= m; j++) a[(j - 1) * n + i] = b[g(i, j)];
    swap(n, m);
  } else {
    for (i = 1; i <= n; i++)
      for (j = 1; j <= m; j++) a[g(i, j)] = b[g(i, j)];
  }
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++) {
      x = a[g(i, j)];
      row[i] += x;
      column[j] += x;
    }
  solve1();
  solve2();
  solve3();
  solve4();
  solve5();
  cout << ans << endl;
  return 0;
}
