#include <bits/stdc++.h>
using namespace std;
long long h, w, max_cost = -1, max_cost2 = -1;
int k[205][205];
bool is_search_a[205][205], is_search_b[205][205];
void cpy() {
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      is_search_b[i][j] = is_search_a[i][j];
    }
  }
}
void dfs(int x, int y, int cost) {
  if (x == h - 1 && y == w - 1) {
    if (max_cost < cost + k[x][y]) {
      max_cost = cost + k[x][y];
      cpy();
    }
    return;
  }
  if (x + 1 < h) {
    is_search_a[x + 1][y] = true;
    dfs(x + 1, y, cost + k[x][y]);
    is_search_a[x + 1][y] = false;
  }
  if (y + 1 < w) {
    is_search_a[x][y + 1] = true;
    dfs(x, y + 1, cost + k[x][y]);
    is_search_a[x][y + 1] = false;
  }
  return;
}
void dfs2(int x, int y, int cost) {
  if (x == h - 1 && y == w - 1) {
    if (max_cost2 < cost) max_cost2 = cost;
    return;
  }
  if (x < h - 1) {
    dfs2(x + 1, y, cost + k[x][y]);
  }
  if (y < w - 1) {
    dfs2(x, y + 1, cost + k[x][y]);
  }
  return;
}
int main(void) {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin >> h >> w;
  for (int i = 0; i < h; i++) {
    fill(is_search_a[i], is_search_a[i] + w, false);
    fill(is_search_b[i], is_search_b[i] + w, false);
  }
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      cin >> k[i][j];
    }
  }
  is_search_a[0][0] = true;
  dfs(0, 0, 0);
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (is_search_b[i][j]) k[i][j] = 0;
    }
  }
  dfs2(0, 0, 0);
  cout << (max_cost + max_cost2) << endl;
  return 0;
}
