#include <bits/stdc++.h>
using namespace std;
int n, m;
long long dp1[1000][1000];
long long dp2[1000][1000];
long long dp3[1000][1000];
long long dp4[1000][1000];
long long ar[1000][1000];
int main() {
  memset(dp1, -1, sizeof(dp1));
  memset(dp2, -1, sizeof(dp2));
  memset(dp3, -1, sizeof(dp3));
  memset(dp4, -1, sizeof(dp4));
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> ar[i][j];
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      dp1[i][j] = ar[i][j] + max(i - 1 >= 0 ? dp1[i - 1][j] : 0,
                                 j - 1 >= 0 ? dp1[i][j - 1] : 0);
    }
  }
  for (int i = n - 1; i >= 0; i--) {
    for (int j = 0; j < m; j++) {
      dp2[i][j] = ar[i][j] + max(i + 1 < n ? dp2[i + 1][j] : 0,
                                 j - 1 >= 0 ? dp2[i][j - 1] : 0);
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = m - 1; j >= 0; j--) {
      dp3[i][j] = ar[i][j] + max(i - 1 >= 0 ? dp3[i - 1][j] : 0,
                                 j + 1 < m ? dp3[i][j + 1] : 0);
    }
  }
  for (int i = n - 1; i >= 0; i--) {
    for (int j = m - 1; j >= 0; j--) {
      dp4[i][j] = ar[i][j] + max(i + 1 < n ? dp4[i + 1][j] : 0,
                                 j + 1 < m ? dp4[i][j + 1] : 0);
    }
  }
  long long res = -1;
  for (int i = 1; i < n - 1; i++) {
    for (int j = 1; j < m - 1; j++) {
      long long way1 =
          dp1[i - 1][j] + dp4[i + 1][j] + dp2[i][j - 1] + dp3[i][j + 1];
      long long way2 =
          dp1[i][j - 1] + dp4[i][j + 1] + dp3[i - 1][j] + dp2[i + 1][j];
      res = max(res, max(way1, way2));
    }
  }
  cout << res << endl;
  return 0;
}
