#include <bits/stdc++.h>
using namespace std;
const long long MIN = -1;
pair<long long, long long> getTwo(vector<long long> arr) {
  long long first, second;
  first = second = MIN;
  for (int i = 0; i < arr.size(); i++) {
    if (arr[i] > first) {
      second = first;
      first = arr[i];
    } else if (arr[i] > second) {
      second = arr[i];
    }
  }
  assert(first != MIN);
  assert(second != MIN);
  return {first, second};
}
int N, M;
vector<vector<long long> > fields, tmp_fields;
vector<long long> row_sum, col_sum;
int main(void) {
  cin >> N >> M;
  long long sum = 0;
  for (int i = 0; i < N; i++) {
    vector<long long> tmp;
    for (int j = 0; j < M; j++) {
      long long x;
      cin >> x;
      sum += x;
      tmp.push_back(x);
    }
    tmp_fields.push_back(tmp);
  }
  if (N <= 4 || M <= 4) {
    cout << sum << endl;
    return 0;
  }
  if (N >= M) {
    for (int i = 0; i < M; i++) {
      vector<long long> tmp;
      for (int j = 0; j < N; j++) {
        long long x = tmp_fields[j][i];
        tmp.push_back(x);
      }
      fields.push_back(tmp);
    }
    long long tmp = N;
    N = M;
    M = tmp;
  } else {
    fields = tmp_fields;
  }
  row_sum.resize(N);
  for (int i = 0; i < N; i++) {
    row_sum[i] = 0;
  }
  col_sum.resize(M);
  for (int i = 0; i < M; i++) {
    col_sum[i] = 0;
  }
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < M; j++) {
      row_sum[i] += fields[i][j];
      col_sum[j] += fields[i][j];
    }
  }
  long long ans = 0;
  for (int i = 0; i < N; i++) {
    vector<long long> cand(M);
    for (int j = 0; j < M; j++) {
      cand[j] = col_sum[j] - fields[i][j];
    }
    for (int k = i + 1; k < N; k++) {
      vector<long long> cand_(M);
      for (int j = 0; j < M; j++) {
        cand_[j] = cand[j] - fields[k][j];
      }
      pair<long long, long long> res = getTwo(cand_);
      ans = max(ans, res.first + res.second + row_sum[i] + row_sum[k]);
    }
  }
  for (int i = 0; i < N; i++) {
    vector<long long> cand(M);
    for (int j = 0; j < M; j++) {
      cand[j] = col_sum[j] - fields[i][j];
    }
    sort(cand.begin(), cand.end());
    long long three_sum = 0;
    for (int j = M - 1; j >= M - 3; j--) {
      three_sum += cand[j];
    }
    ans = max(ans, row_sum[i] + three_sum);
  }
  for (int j = 0; j < M; j++) {
    vector<long long> cand(N);
    for (int i = 0; i < N; i++) {
      cand[i] = row_sum[i] - fields[i][j];
    }
    sort(cand.begin(), cand.end());
    long long three_sum = 0;
    for (int i = N - 1; i >= N - 3; i--) {
      three_sum += cand[i];
    }
    ans = max(ans, col_sum[j] + three_sum);
  }
  sort(row_sum.begin(), row_sum.end());
  long long four_sum = 0;
  for (int i = N - 1; i >= N - 4; i--) {
    four_sum += row_sum[i];
  }
  ans = max(ans, four_sum);
  sort(col_sum.begin(), col_sum.end());
  four_sum = 0;
  for (int j = M - 1; j >= M - 4; j--) {
    four_sum += col_sum[j];
  }
  ans = max(ans, four_sum);
  cout << ans << endl;
}
