#include <bits/stdc++.h>
using namespace std;
int n, m;
long long g[1005][1005];
long long mem1[1005][1005];
long long mem2[1005][1005];
long long mem3[1005][1005];
long long mem4[1005][1005];
const long long OO = 1e18;
long long dp1(int i, int j) {
  if (i > n - 1 || j > m - 1 || i < 0 || j < 0) {
    return -OO;
  }
  if (i == n - 1 && j == m - 1) {
    return g[n - 1][m - 1];
  }
  long long &ret = mem1[i][j];
  if (ret != -1) {
    return ret;
  }
  ret = max(dp1(i + 1, j) + g[i][j], dp1(i, j + 1) + g[i][j]);
  return ret;
}
long long dp2(int i, int j) {
  if (i > n - 1 || j > m - 1 || i < 0 || j < 0) {
    return -OO;
  }
  if (i == 0 && j == m - 1) {
    return g[0][m - 1];
  }
  long long &ret = mem2[i][j];
  if (ret != -1) {
    return ret;
  }
  ret = max(dp2(i - 1, j) + g[i][j], dp2(i, j + 1) + g[i][j]);
  return ret;
}
long long dp3(int i, int j) {
  if (i > n - 1 || j > m - 1 || i < 0 || j < 0) {
    return -OO;
  }
  if (i == n - 1 && j == 0) {
    return g[n - 1][0];
  }
  long long &ret = mem3[i][j];
  if (ret != -1) {
    return ret;
  }
  ret = max(dp3(i + 1, j) + g[i][j], dp3(i, j - 1) + g[i][j]);
  return ret;
}
long long dp4(int i, int j) {
  if (i > n - 1 || j > m - 1 || i < 0 || j < 0) {
    return -OO;
  }
  if (i == 0 && j == 0) {
    return g[0][0];
  }
  long long &ret = mem4[i][j];
  if (ret != -1) {
    return ret;
  }
  ret = max(dp4(i - 1, j) + g[i][j], dp4(i, j - 1) + g[i][j]);
  return ret;
}
int main() {
  memset(mem1, -1, sizeof mem1);
  memset(mem2, -1, sizeof mem2);
  memset(mem3, -1, sizeof mem3);
  memset(mem4, -1, sizeof mem4);
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> g[i][j];
    }
  }
  long long ans = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      ans = max(ans,
                dp1(i, j + 1) + dp2(i - 1, j) + dp3(i + 1, j) + dp4(i, j - 1));
      ans = max(ans,
                dp1(i + 1, j) + dp2(i, j + 1) + dp3(i, j - 1) + dp4(i - 1, j));
    }
  }
  cout << ans;
  return 0;
}
