#include <bits/stdc++.h>
using namespace std;
int n, m;
int v[1010][1010];
int dpa[1010][1010];
int dpreva[1010][1010];
int dpb[1010][1010];
int dprevb[1010][1010];
int solvea(int currx, int curry) {
  if (currx == n && curry == m) return dpa[currx][curry] = v[currx][curry];
  int& ret = dpa[currx][curry];
  if (ret != -1) return ret;
  if (currx + 1 <= n) {
    ret = max(ret, solvea(currx + 1, curry) + v[currx][curry]);
  }
  if (curry + 1 <= m) {
    ret = max(ret, solvea(currx, curry + 1) + v[currx][curry]);
  }
  return ret;
}
int solvereva(int currx, int curry) {
  if (currx == 1 && curry == 1) return dpreva[currx][curry] = v[currx][curry];
  int& ret = dpreva[currx][curry];
  if (ret != -1) return ret;
  if (currx - 1 >= 1) {
    ret = max(ret, solvereva(currx - 1, curry) + v[currx][curry]);
  }
  if (curry - 1 >= 1) {
    ret = max(ret, solvereva(currx, curry - 1) + v[currx][curry]);
  }
  return ret;
}
int solveb(int currx, int curry) {
  if (currx == 1 && curry == m) return dpb[currx][curry] = v[currx][curry];
  int& ret = dpb[currx][curry];
  if (ret != -1) return ret;
  if (currx - 1 >= 1) {
    ret = max(ret, solveb(currx - 1, curry) + v[currx][curry]);
  }
  if (curry + 1 <= m) {
    ret = max(ret, solveb(currx, curry + 1) + v[currx][curry]);
  }
  return ret;
}
int solverevb(int currx, int curry) {
  if (currx == n && curry == 1) return dprevb[currx][curry] = v[currx][curry];
  int& ret = dprevb[currx][curry];
  if (ret != -1) return ret;
  if (currx + 1 <= n) {
    ret = max(ret, solverevb(currx + 1, curry) + v[currx][curry]);
  }
  if (curry - 1 >= 1) {
    ret = max(ret, solverevb(currx, curry - 1) + v[currx][curry]);
  }
  return ret;
}
int main(void) {
  ios ::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      cin >> v[i][j];
    }
  }
  memset(dpa, -1, sizeof dpa);
  memset(dpreva, -1, sizeof dpreva);
  memset(dpb, -1, sizeof dpb);
  memset(dprevb, -1, sizeof dprevb);
  solvea(1, 1);
  solvereva(n, m);
  solveb(n, 1);
  solverevb(1, m);
  int res = 0;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      int dist = 0;
      int dist2 = 0;
      if (j - 1 >= 1 && j + 1 <= m && i - 1 >= 1 && i + 1 <= n) {
        dist =
            dprevb[i][j - 1] + dpb[i][j + 1] + dpreva[i - 1][j] + dpa[i + 1][j];
        dist2 =
            dprevb[i + 1][j] + dpb[i - 1][j] + dpreva[i][j - 1] + dpa[i][j + 1];
      }
      res = max(res, dist);
      res = max(res, dist2);
    }
  }
  cout << res << "\n";
  return 0;
}
