#include <bits/stdc++.h>
using namespace std;
template <typename T>
ostream& operator<<(ostream& out, vector<T> a) {
  for (int i = (int)(0); i < (int)((int)a.size()); i++)
    if (i != (int)a.size() - 1)
      out << a[i] << " ";
    else
      out << a[i] << endl;
  return out;
}
template <typename T1, typename T2>
istream& operator>>(istream& in, pair<T1, T2>& a) {
  in >> a.first >> a.second;
  return in;
}
template <typename T1, typename T2>
ostream& operator<<(ostream& out, pair<T1, T2>& a) {
  out << a.first << " " << a.second;
  return out;
}
struct fastio {
  fastio() {
    string filename = "";
    if (filename.size()) {
      string inp = filename + ".in";
      string out = filename + ".out";
      freopen(inp.c_str(), "r", stdin);
      freopen(out.c_str(), "w", stdout);
    }
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout << showpoint;
    cout << setprecision(12);
    cout << fixed;
    cerr << showpoint;
    cerr << setprecision(3);
    cerr << fixed;
  }
} _____;
const int MAX = 1e5 + 10;
const long long INF = 1e9 + 10;
const long double EPS = 1e-8;
const long long MOD = 1e9 + 7;
int n, m;
vector<long long> r, c;
vector<vector<long long> > a, b;
void refresh(int ind, bool is_row) {
  if (is_row) {
    for (int i = (int)(0); i < (int)(m + 1); i++) {
      c[i] -= a[ind][i];
      a[ind][i] = 0;
    }
    r[ind] = 0;
  } else {
    for (int i = (int)(0); i < (int)(n + 1); i++) {
      r[i] -= a[i][ind];
      a[i][ind] = 0;
    }
    c[ind] = 0;
  }
}
long long end_ans;
void solve() {
  cin >> n >> m;
  a.resize(n + 1);
  a[0].resize(m + 1);
  for (int i = (int)(1); i < (int)(n + 1); i++) {
    a[i].resize(m + 1);
    for (int j = (int)(1); j < (int)(m + 1); j++) {
      cin >> a[i][j];
    }
  }
  b = a;
  for (int mask = (int)(0); mask < (int)(1 << 4); mask++) {
    a = b;
    ;
    ;
    r.resize(n + 1);
    c.resize(m + 1);
    fill(r.begin(), r.end(), 0);
    fill(c.begin(), c.end(), 0);
    for (int i = (int)(0); i < (int)(n + 1); i++)
      for (int j = (int)(0); j < (int)(m + 1); j++) {
        r[i] += a[i][j];
        c[j] += a[i][j];
      };
    ;
    long long ans = 0;
    int cur = mask;
    for (int _for_ans = (int)(0); _for_ans < (int)(4); _for_ans++) {
      long long maxx = -1;
      int ind = 0;
      bool is_row = true;
      if (cur % 2) {
        for (int i = (int)(0); i < (int)(n + 1); i++)
          if (r[i] > maxx) {
            is_row = true;
            maxx = r[i];
            ind = i;
          }
      } else {
        for (int i = (int)(0); i < (int)(m + 1); i++)
          if (c[i] > maxx) {
            is_row = false;
            maxx = c[i];
            ind = i;
          }
      }
      ans += maxx;
      refresh(ind, is_row);
      end_ans = max(end_ans, ans);
      cur /= 2;
    };
    ;
    ;
    ;
  }
  cout << end_ans << endl;
}
int main() {
  solve();
  return 0;
}
