#include using namespace std; #define SZ(x) (int) (x).size() #define REP(i, n) for(int i = 0; i < (n); i++) #define FOR(i, a, b) for(auto i = (a); i < (b); i++) #define For(i, a, b, c) \ for(auto i = (a); i != (b); i += (c)) #define REPR(i, n) for(auto i = (n) -1; i >= 0; i--) #define ALL(s) (s).begin(), (s).end() #define so(V) sort(ALL(V)) #define rev(V) reverse(ALL(V)) #define uni(v) v.erase(unique(ALL(v)), (v).end()) #define eb emplace_back typedef unsigned long long ull; typedef long long ll; typedef vector vi; typedef vector vll; typedef vector vb; typedef vector vvi; typedef vector vvll; typedef pair PI; typedef pair PL; const double EPS = 1e-6; const int MOD = 1e9 + 7; const int INF = (1 << 30); const ll LINF = 1e18; const double math_PI = acos(-1); template vector make_v(size_t a) { return vector(a); } template auto make_v(size_t a, Ts... ts) { return vector(ts...))>( a, make_v(ts...)); } template typename enable_if::value == 0>::type fill_v( T& t, const V& v) { t = v; } template typename enable_if::value != 0>::type fill_v( T& t, const V& v) { for(auto& e: t) fill_v(e, v); } template bool chmax(T& a, const T& b) { if(a < b) { a = b; return true; } return false; } template bool chmin(T& a, const T& b) { if(a > b) { a = b; return true; } return false; } template istream& operator>>(istream& is, pair& p) { cin >> p.first >> p.second; return is; } template istream& operator>>(istream& is, vector& vec) { for(T& x: vec) is >> x; return is; } template string join(vector& vec, string splitter) { stringstream ss; REP(i, SZ(vec)) { if(i != 0) ss << splitter; ss << vec[i]; } return ss.str(); } template ostream& operator<<(ostream& os, vector& vec) { os << join(vec, " "); return os; } template struct RangeSum { private: vector V; int N = -1; public: RangeSum(vector &v) { N = SZ(v); V = vector(N + 1); V[0] = T(0); REP(i, N) { V[i + 1] = v[i] + V[i]; } } T sum(int l, int r) { chmax(l, 0); chmin(r, N); chmax(r, l); return V[r] - V[l]; } }; template struct RangeSum2D { private: vector> V; int H = -1; int W = -1; public: RangeSum2D(vector> &v) { H = SZ(v); W = SZ(v[0]); V = vector>(H, vector(W)); REP(i, H) { REP(j, W) { V[i][j] += v[i][j]; if(i != 0) V[i][j] += V[i - 1][j]; if(j != 0) V[i][j] += V[i][j - 1]; if(i != 0 && j != 0) V[i][j] -= V[i - 1][j - 1]; } } } T sum(int y1, int x1, int y2, int x2) { T ret = V[y2][x2]; if(y1 != 0) ret -= V[y1 - 1][x2]; if(x1 != 0) ret -= V[y2][x1 - 1]; if(y1 != 0 && x1 != 0) ret += V[y1 - 1][x1 - 1]; return ret; } }; int main() { cin.tie(nullptr); ios::sync_with_stdio(false); int H, W; cin >> H >> W; vvi A(H - 2, vi(W)); cin >> A; vvll T(W, vll(H - 2)); REP(i, H - 2) { REP(j, W) { T[j][i] = A[i][j]; if(A[i][j] == -1) { T[j][i] = INF; } } } auto dp = make_v(W, H - 2); fill_v(dp, INF); REP(j, H - 2) dp[0][j] = T[0][j]; REP(i, W - 1) { RangeSum RS(T[i + 1]); REP(j, H - 2) { REP(k, H - 2) { if(j == k) { chmin(dp[i + 1][k], dp[i][j] + T[i + 1][k]); } else if(j > k) { chmin(dp[i + 1][k], dp[i][j] + RS.sum(k, j)); } else { chmin(dp[i + 1][k], dp[i][j] + RS.sum(j + 1, k + 1)); } } } } ll ans = INF; REP(i, H - 2) { chmin(ans, dp[W - 1][i]); } if(ans >= INF) { cout << -1 << endl; } else { cout << ans << endl; } return 0; }