#include <bits/stdc++.h>
#pragma GCC optimize("O3", "unroll-loops")
using namespace std;
long long v4(int n, int m, vector<vector<int>> a) {
  vector<long long> total(m, 0LL);
  for (int j = 0; j < m; ++j)
    for (int i = 0; i < n; ++i) total[j] += a[i][j];
  sort(total.begin(), total.end());
  long long res = 0LL;
  for (int i = 1; i <= 4; ++i) res += total[m - i];
  return res;
}
long long h1v3(int n, int m, vector<vector<int>> a) {
  vector<long long> total(m, 0LL);
  for (int j = 0; j < m; ++j)
    for (int i = 0; i < n; ++i) total[j] += a[i][j];
  long long res = 0LL;
  for (int i = 0; i < n; ++i) {
    long long tmp = accumulate(a[i].begin(), a[i].end(), 0LL);
    long long mx[3] = {};
    for (int j = 0; j < m; ++j) {
      for (int k = 0; k < 3; ++k) {
        if (mx[k] < total[j] - a[i][j]) {
          for (int k_ = 2; k_ >= k + 1; --k_) mx[k_] = mx[k_ - 1];
          mx[k] = total[j] - a[i][j];
          break;
        }
      }
    }
    tmp += mx[0] + mx[1] + mx[2];
    res = max(res, tmp);
  }
  return res;
}
long long h2v2(int n, int m, vector<vector<int>> a) {
  if (n > m) return 0LL;
  vector<long long> total(m, 0LL);
  for (int j = 0; j < m; ++j)
    for (int i = 0; i < n; ++i) total[j] += a[i][j];
  long long res = 0LL;
  for (int i1 = 0; i1 < n; ++i1) {
    for (int i2 = i1 + 1; i2 < n; ++i2) {
      long long tmp = accumulate(a[i1].begin(), a[i1].end(), 0LL);
      tmp += accumulate(a[i2].begin(), a[i2].end(), 0LL);
      long long mx[2] = {};
      for (int j = 0; j < m; ++j) {
        for (int k = 0; k < 2; ++k) {
          if (mx[k] < total[j] - a[i1][j] - a[i2][j]) {
            for (int k_ = 1; k_ >= k + 1; --k_) mx[k_] = mx[k_ - 1];
            mx[k] = total[j] - a[i1][j] - a[i2][j];
            break;
          }
        }
      }
      tmp += mx[0] + mx[1];
      res = max(res, tmp);
    }
  }
  return res;
}
signed main() {
  int n, m;
  cin >> n >> m;
  if (n <= 4 || m <= 4) {
    long long ans = 0;
    long long c = (long long)n * m;
    while (c--) {
      int aij;
      cin >> aij;
      ans += aij;
    }
    cout << ans << endl;
    return 0;
  }
  vector<vector<int>> a(n);
  for (int i = 0; i < n; ++i) {
    a[i].resize(m);
    for (int j = 0; j < m; ++j) cin >> a[i][j];
  }
  long long ans = 0;
  ans = max(ans, v4(n, m, a));
  ans = max(ans, h1v3(n, m, a));
  ans = max(ans, h2v2(n, m, a));
  vector<vector<int>> ta(m);
  for (int i = 0; i < m; ++i) {
    ta[i].resize(n);
    for (int j = 0; j < n; ++j) ta[i][j] = a[j][i];
  }
  swap(n, m);
  ans = max(ans, v4(n, m, ta));
  ans = max(ans, h1v3(n, m, ta));
  ans = max(ans, h2v2(n, m, ta));
  cout << ans << endl;
  return 0;
}
