#include <bits/stdc++.h>
using namespace std;
const long long M = 1e5 + 10, M2 = 1e6 + 10, oo = 1e9 + 7;
int cnta[30], cntb[30];
vector<long long> rv, cv;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long m, n;
  cin >> n >> m;
  long long ara[n + 5][m + 5];
  vector<long long> rs(n + 5, 0), cs(m + 5, 0);
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < m; j++) {
      cin >> ara[i][j];
      rs[i] += ara[i][j];
      cs[j] += ara[i][j];
    }
  }
  for (int i = 0; i < n; i++) {
    rv.push_back(rs[i]);
  }
  for (int i = 0; i < m; i++) cv.push_back(cs[i]);
  long long ans = 0, tmp = 0;
  sort(rv.rbegin(), rv.rend());
  sort(cv.rbegin(), cv.rend());
  for (int i = 0; i < 4 && i < rv.size(); i++) ans += rv[i];
  for (int j = 0; j < 4 && j < cv.size(); j++) tmp += cv[j];
  ans = max(ans, tmp);
  tmp = 0;
  for (int i = 0; i < n; i++) {
    priority_queue<long long> pq;
    tmp = 0;
    for (int j = 0; j < m; j++) {
      pq.push(cs[j] - ara[i][j]);
    }
    for (int k = 0; k < 3 && !pq.empty(); k++) {
      tmp += pq.top();
      pq.pop();
    }
    ans = max(tmp + rs[i], ans);
  }
  for (int i = 0; i < m; i++) {
    priority_queue<long long> pq;
    tmp = 0;
    for (int j = 0; j < n; j++) {
      pq.push(rs[j] - ara[j][i]);
    }
    for (int k = 0; k < 3 && !pq.empty(); k++) {
      tmp += pq.top();
      pq.pop();
    }
    ans = max(tmp + cs[i], ans);
  }
  if (m >= n) {
    for (int i = 0; i < n; i++) {
      for (int j = i + 1; j < n; j++) {
        priority_queue<long long> pq;
        tmp = 0;
        for (int k = 0; k < m; k++) {
          pq.push(cs[k] - ara[i][k] - ara[j][k]);
        }
        for (int k = 0; k < 2 && !pq.empty(); k++) {
          tmp += pq.top();
          pq.pop();
        }
        ans = max(ans, tmp + rs[i] + rs[j]);
      }
    }
  } else {
    for (int i = 0; i < m; i++) {
      for (int j = i + 1; j < m; j++) {
        priority_queue<long long> pq;
        tmp = 0;
        for (int k = 0; k < n; k++) {
          pq.push(rs[k] - ara[k][i] - ara[k][j]);
        }
        for (int k = 0; k < 2 && !pq.empty(); k++) {
          tmp += pq.top();
          pq.pop();
        }
        ans = max(ans, tmp + rs[i] + rs[j]);
      }
    }
  }
  cout << ans << endl;
  return 0;
}
