#include <bits/stdc++.h>   using namespace std;   const int OO = 1e9;   const double EPS = 1e-9;   template <class T>   void _db(const char* dbStr, T e) {     cout << dbStr <<   =   << e << endl;   }   template <class T, class... L>   void _db(const char* dbStr, T e, L... r) {     while (*dbStr !=  , ) cout << *dbStr++;     cout <<   =   << e <<  , ;     _db(dbStr + 1, r...);   }   template <class S, class T>   ostream& operator<<(ostream& o, const map<S, T>& v) {     o <<  [ ;     int i = 0;     for (const pair<S, T>& pr : v)       o << (!i++ ?    :  ,  ) <<  {  << pr.first <<   :   << pr.second <<  } ;     return o <<  ] ;   }   template <template <class, class...> class S, class T, class... L>   ostream& operator<<(ostream& o, const S<T, L...>& v) {     o <<  [ ;     int i = 0;     for (const auto& e : v) o << (!i++ ?    :  ,  ) << e;     return o <<  ] ;   }   template <class S, class T>   ostream& operator<<(ostream& o, const pair<S, T>& pr) {     return o <<  (  << pr.first <<  ,   << pr.second <<  ) ;   }   ostream& operator<<(ostream& o, const string& s) {     for (const char& c : s) o << c;     return o;   }   template <class T>   using V = vector<T>;   template <class T>   using VV = V<V<T>>;   template <class T>   using VVV = VV<V<T>>;   using ll = long long;   using pii = pair<int, int>;   using vi = V<int>;   using vii = V<pii>;   using vvi = VV<int>;   using mii = map<int, int>;   using umii = unordered_map<int, int>;   using si = set<int>;   using usi = unordered_set<int>;   const int MX = 2e5 + 5;   int N, M;   ll s[5];   vvi A, B;   ll sumR[MX], sumC[MX];   int main() {     ios::sync_with_stdio(false);     cout.precision(10);     cin.tie(0);     cin >> N >> M;     A.assign(N, vi(M));     for (int i = 0; i < N; ++i) {       for (int j = 0; j < M; ++j) {         cin >> A[i][j];       }     }     if (max(N, M) <= 2) {       ll ans = 0;       for (int i = 0; i < N; ++i) {         for (int j = 0; j < M; ++j) {           ans += A[i][j];         }       }       cout << ans <<   n ;       return 0;     }     if (N > M) {       B = A;       A.assign(M, vi(N));       for (int i = 0; i < N; ++i) {         for (int j = 0; j < M; ++j) {           A[j][i] = B[i][j];         }       }       swap(N, M);     }     for (int i = 0; i < N; ++i) {       for (int j = 0; j < M; ++j) {         sumR[i] += A[i][j];         sumC[j] += A[i][j];       }     }     ll ans = 0;     ll cand = 0;     if (N >= 4) {       for (int i = 0; i < N; ++i) {         s[0] = sumR[i];         sort(s, s + 5);       }       for (int i = 1; i < 5; ++i) {         cand += s[i];       }       ans = max(ans, cand);     }     true;     s[0] = s[1] = s[2] = s[3] = s[4] = 0;     if (M >= 4) {       for (int i = 0; i < M; ++i) {         s[0] = sumC[i];         sort(s, s + 5);       }       cand = 0;       for (int i = 1; i < 5; ++i) {         cand += s[i];       }     }     ans = max(ans, cand);     true;     if (M >= 3) {       for (int i = 0; i < N; ++i) {         s[0] = s[1] = s[2] = s[3] = 0;         for (int j = 0; j < M; ++j) {           s[0] = sumC[j] - A[i][j];           sort(s, s + 4);         }         cand = 0;         for (int j = 1; j < 4; ++j) {           cand += s[j];         }         ans = max(ans, sumR[i] + cand);       }     }     true;     if (N >= 3) {       for (int i = 0; i < M; ++i) {         s[0] = s[1] = s[2] = s[3] = 0;         for (int j = 0; j < N; ++j) {           s[0] = sumR[j] - A[j][i];           sort(s, s + 4);         }         cand = 0;         for (int j = 1; j < 4; ++j) {           cand += s[j];         }         ans = max(ans, sumC[i] + cand);       }     }     true;     s[0] = s[1] = s[2] = 0;     {       for (int i = 0; i < N; ++i) {         for (int j = i + 1; j < N; ++j) {           s[0] = s[1] = s[2] = 0;           cand = 0;           for (int k = 0; k < M; ++k) {             s[0] = sumC[k] - A[i][k] - A[j][k];             sort(s, s + 3);           }           ans = max(ans, sumR[i] + sumR[j] + s[1] + s[2]);         }       }     }     true;     cout << ans <<   n ;     return 0;   }