#include <bits/stdc++.h>
using namespace std;
const int maxn = ((int)1e3) + 10;
long long memo1[maxn][maxn];
long long memo2[maxn][maxn];
long long memo1r[maxn][maxn];
long long memo2r[maxn][maxn];
int n, m;
long long val[maxn][maxn];
long long dp(int x, int y, int v, int p1, int p2) {
  if (x < 0 || x >= n || y < 0 || y >= m) return 0LL;
  long long *ref;
  if (v == 1)
    ref = &(memo1[x][y]);
  else if (v == 2)
    ref = &(memo1r[x][y]);
  else if (v == 3)
    ref = &(memo2[x][y]);
  else
    ref = &(memo2r[x][y]);
  if ((*ref) != -1LL) return (*ref);
  *ref = 0LL;
  *ref = max(dp(x + p1, y, v, p1, p2), dp(x, y + p2, v, p1, p2));
  (*ref) += val[x][y];
  return *ref;
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) cin >> val[i][j];
  memset(memo1, -1, sizeof memo1);
  memset(memo1r, -1, sizeof memo1r);
  memset(memo2, -1, sizeof memo2);
  memset(memo2r, -1, sizeof memo2r);
  long long res = 0LL;
  for (int i = 1; i + 1 < n; i++)
    for (int j = 1; j + 1 < m; j++) {
      res = max(res, dp(i - 1, j, 1, -1, -1) + dp(i + 1, j, 2, 1, 1) +
                         dp(i, j + 1, 4, -1, 1) + dp(i, j - 1, 3, 1, -1));
      res = max(res, dp(i, j - 1, 1, -1, -1) + dp(i, j + 1, 2, 1, 1) +
                         dp(i - 1, j, 4, -1, 1) + dp(i + 1, j, 3, 1, -1));
    }
  cout << res << endl;
  return 0;
}
