#include <bits/stdc++.h>
long long n, m, sol;
std::vector<long long> map[100005][2];
long long sum_lin[100005][2], sum_col[100005][2];
long long check_1(long long pos, long long n);
long long check_2(long long pos, long long n, long long m);
long long check_3(long long pos, long long n, long long m);
int main() {
  std::cin >> n >> m;
  for (long long i = 1; i <= n; ++i) map[i][0].push_back(0);
  for (long long i = 1; i <= m; ++i) map[i][1].push_back(0);
  for (long long i = 1; i <= n; ++i) {
    for (long long j = 1; j <= m; ++j) {
      long long x;
      std::cin >> x;
      map[i][0].push_back(x);
      sum_col[j][0] += x;
      sum_lin[i][0] += x;
      map[j][1].push_back(x);
      sum_col[i][1] += x;
      sum_lin[j][1] += x;
    }
  }
  if (n <= 4) {
    for (long long i = 1; i <= n; ++i) sol += sum_lin[i][0];
    std::cout << sol;
    return 0;
  }
  if (m <= 4) {
    for (long long i = 1; i <= m; ++i) sol += sum_lin[i][1];
    std::cout << sol;
    return 0;
  }
  sol = std::max(sol, check_1(0LL, n));
  sol = std::max(sol, check_1(1LL, m));
  sol = std::max(sol, check_2(0LL, n, m));
  sol = std::max(sol, check_2(1LL, m, n));
  if (n <= m)
    sol = std::max(sol, check_3(0LL, n, m));
  else
    sol = std::max(sol, check_3(1LL, m, n));
  std::cout << sol;
  return 0;
}
long long check_1(long long pos, long long n) {
  long long m1 = 0LL, m2 = 0LL, m3 = 0LL, m4 = 0LL;
  for (long long i = 1LL; i <= n; ++i) {
    if (sum_lin[i][pos] > m1) {
      m4 = m3;
      m3 = m2;
      m2 = m1;
      m1 = sum_lin[i][pos];
    } else if (sum_lin[i][pos] > m2) {
      m4 = m3;
      m3 = m2;
      m2 = sum_lin[i][pos];
    } else if (sum_lin[i][pos] > m3) {
      m4 = m3;
      m3 = sum_lin[i][pos];
    } else if (sum_lin[i][pos] > m4)
      m4 = sum_lin[i][pos];
  }
  return m1 + m2 + m3 + m4;
}
long long check_2(long long pos, long long n, long long m) {
  long long m1, m2, m3;
  long long ret = 0LL;
  for (long long i = 1; i <= n; ++i) {
    m1 = m2 = m3 = 0LL;
    for (long long j = 1; j <= m; ++j) {
      long long val = sum_col[j][pos] - map[i][pos][j];
      if (val > m1) {
        m3 = m2;
        m2 = m1;
        m1 = val;
      } else if (val > m2) {
        m3 = m2;
        m2 = val;
      } else if (val > m3)
        m3 = val;
    }
    ret = std::max(ret, m1 + m2 + m3 + sum_lin[i][pos]);
  }
  return ret;
}
long long check_3(long long pos, long long n, long long m) {
  long long m1, m2;
  long long ret = 0LL;
  for (long long i = 1; i < n; ++i) {
    for (long long j = i + 1; j <= n; ++j) {
      m1 = m2 = 0;
      for (long long k = 1; k <= m; ++k) {
        long long val = sum_col[k][pos] - map[i][pos][k] - map[j][pos][k];
        if (val > m1) {
          m2 = m1;
          m1 = val;
        } else if (val > m2)
          m2 = val;
      }
      ret = std::max(ret, m1 + m2 + sum_lin[i][pos] + sum_lin[j][pos]);
    }
  }
  return ret;
}
