#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 2;
long long n, m;
long long shu[maxn];
long long shu_1[maxn];
long long hang[maxn], lie[maxn];
priority_queue<long long, vector<long long>, greater<long long> > paopao;
long long function_1() {
  long long sum = 0;
  while ((int)paopao.size()) paopao.pop();
  for (int i = 1; i <= n; i++) {
    if ((int)paopao.size() < 4) {
      paopao.push(hang[i]);
    } else {
      if (paopao.top() < hang[i]) {
        paopao.pop();
        paopao.push(hang[i]);
      }
    }
  }
  while ((int)paopao.size()) {
    sum += paopao.top();
    paopao.pop();
  }
  return sum;
}
long long function_2() {
  long long sum = 0;
  for (int j = 1; j <= m; j++) {
    if ((int)paopao.size() < 4) {
      paopao.push(lie[j]);
    } else {
      if (paopao.top() < lie[j]) {
        paopao.pop();
        paopao.push(lie[j]);
      }
    }
  }
  while ((int)paopao.size()) {
    sum += paopao.top();
    paopao.pop();
  }
  return sum;
}
long long function_3() {
  long long sum = 0;
  for (int j = 1; j <= m; j++) {
    for (int i = 1; i <= n; i++) {
      if ((int)paopao.size() < 3) {
        paopao.push(hang[i] - shu[(i - 1) * m + j]);
      } else {
        if (paopao.top() < (hang[i] - shu[(i - 1) * m + j])) {
          paopao.pop();
          paopao.push(hang[i] - shu[(i - 1) * m + j]);
        }
      }
    }
    long long sum_1 = 0;
    while ((int)paopao.size()) {
      sum_1 += paopao.top();
      paopao.pop();
    }
    sum_1 += lie[j];
    sum = max(sum, sum_1);
  }
  return sum;
}
long long function_4() {
  long long sum = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if ((int)paopao.size() < 3) {
        paopao.push(lie[j] - shu[(i - 1) * m + j]);
      } else {
        if (paopao.top() < (lie[j] - shu[(i - 1) * m + j])) {
          paopao.pop();
          paopao.push(lie[j] - shu[(i - 1) * m + j]);
        }
      }
    }
    long long sum_1 = 0;
    while ((int)paopao.size()) {
      sum_1 += paopao.top();
      paopao.pop();
    }
    sum_1 += hang[i];
    sum = max(sum, sum_1);
  }
  return sum;
}
long long function_5() {
  long long sum = 0;
  for (int i = 1; i <= n; i++) {
    for (int k = i + 1; k <= n; k++) {
      for (int j = 1; j <= m; j++) {
        if ((int)paopao.size() < 2) {
          paopao.push(lie[j] - shu[(i - 1) * m + j] - shu[(k - 1) * m + j]);
        } else {
          if (paopao.top() <
              (lie[j] - shu[(i - 1) * m + j] - shu[(k - 1) * m + j])) {
            paopao.pop();
            paopao.push((lie[j] - shu[(i - 1) * m + j] - shu[(k - 1) * m + j]));
          }
        }
      }
      long long sum_1 = 0;
      while ((int)paopao.size()) {
        sum_1 += paopao.top();
        paopao.pop();
      }
      sum_1 += (hang[i] + hang[k]);
      sum = max(sum, sum_1);
    }
  }
  return sum;
}
int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      cin >> shu_1[(i - 1) * m + j];
      if (n > m) {
        shu[(j - 1) * n + i] = shu_1[(i - 1) * m + j];
      } else
        shu[(i - 1) * m + j] = shu_1[(i - 1) * m + j];
    }
  }
  if (n > m) {
    swap(n, m);
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      hang[i] += shu[(i - 1) * m + j];
      lie[j] += shu[(i - 1) * m + j];
    }
  }
  long long max_shu = 0;
  max_shu = max(max_shu, function_1());
  max_shu = max(max_shu, function_2());
  max_shu = max(max_shu, function_3());
  max_shu = max(max_shu, function_4());
  max_shu = max(max_shu, function_5());
  cout << max_shu;
  return 0;
}
