/*
TASK:apple
LANG:C++
*/

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>

using namespace std;

#define MAXN 128

int dp[2][MAXN][MAXN][MAXN]; //granica, pos1, pos2
int a[MAXN][MAXN];
int N, M;

inline int max(int a, int b) {
    return (a>b?a:b);
}

int main() {
    
    int i, j, k, m;
    
    scanf("%d%d", &N, &M);
    
    for (i = 1; i <= N; i++) {
        for (j = 1; j <= M; j++) {
            scanf("%d", &a[i][j]);
        }
    }
    int apple = a[1][1];
    a[1][1] = 0;

    int now = 1;
    int prev = 0;
    
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j < M; j++) {
            for (int x = 0; x <= j; x++) {
                for (int y = j + 1; y <= M; y++) {
                    if (y > j + 1) {
                        dp[now][j][x][y] = dp[now][j][x][y-1] + a[i][y];
                    }
                    dp[now][j][x][y] = max(dp[now][j][x][y], dp[now][j][x-1][y] + a[i][x]);
                    dp[now][j][x][y] = max(
                                        dp[now][j][x][y],
                                        max( 
                                            dp[prev][x][x][y],
                                            dp[prev][y-1][x][y]
                                        ) + a[i][x] + a[i][y]
                                       );
                }
            }
        }
        prev = 1 - prev;
        now = 1 - now;
    }
    
    int ans = 0;
    
    for (int i = 1; i <= M; i++) {
        for (int j = 0; j <= i; j++) {
            for (int k = i + 1; k <= M; k++) {
                if (dp[prev][i][j][k] > ans) {
                    ans = dp[prev][i][j][k];
                }
            }
        }
    }
    
    printf("%d\n", apple + ans);
    
    return 0;
}
