#include using namespace std; #include using namespace atcoder; using ll = long long; using VI = vector; using VVI = vector; using VL = vector; using VVL = vector; using VD = vector; using VVD = vector; using VS = vector; using P = pair; using VP = vector

; #define rep(i, n) for (ll i = 0; i < ll(n); i++) #define out(x) cout << x << endl #define dout(x) cout << fixed << setprecision(10) << x << endl #define all(a) (a).begin(),(a).end() #define rall(a) (a).rbegin(),(a).rend() #define sz(x) (int)(x.size()) #define re0 return 0 #define pcnt __builtin_popcountll template inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } constexpr int inf = 1e9; constexpr ll INF = 1e18; //using mint = modint1000000007; using mint = modint998244353; int di[4] = {1,0,-1,0}; int dj[4] = {0,1,0,-1}; int main(){ ll h,w; cin >> h >> w; VVL a(h,VL(w,ll(1e10))); for(int i = 1;i < h-1;i++)rep(j,w){ cin >> a[i][j]; if(a[i][j] == -1) a[i][j] = ll(1e10); } auto id = [&](int i,int j,bool in){ if(in) return i*w+j; else return i*w+j+h*w; }; int si = 2*h*w; int gi = si+1; mf_graph g(2*h*w+2); rep(i,h)rep(j,w){ g.add_edge(id(i,j,1),id(i,j,0),a[i][j]); rep(v,4){ int ni = i+di[v]; int nj = j+dj[v]; if(ni < 0 || nj < 0 || ni >= h || nj >= w) continue; g.add_edge(id(ni,nj,0),id(i,j,1),ll(1e10)); } } rep(j,w) g.add_edge(si,id(0,j,1),ll(1e10)); rep(j,w) g.add_edge(id(h-1,j,0),gi,ll(1e10)); ll ans = g.flow(si,gi); if(ans >= ll(1e10)) ans = -1; out(ans); }