#include <bits/stdc++.h>
using namespace std;
#define int long long
#define vi vector<int>
#define fi first
#define se second
#define pb push_back
#define ii pair<int , int>
#define pq priority_queue
#define iii pair<int , pair<int , int>>
#define fo(i,l,r) for(int i=l;i<=r;i++)
#define fod(i,r,l) for(int i=r;i>=l;i--)
#define fill(f,x) memset(f,x,sizeof(f))
#define NAME "file"

const int N = 1e3 + 5, mod = 1e9 + 7;
vector <int> g[N*N];
int a[N][N] , p[N*N] , id[N][N] , s[N*N] , d[N*N];
unordered_map <int , bool> mp[N*N];
int n , m;

int acs(int u)
{
    if (p[u] == u) return u;
    return p[u] = acs(p[u]);
}
void join(int u , int v)
{
    int x = acs(u);
    int y = acs(v);
    if (x != y)
    {
        p[x] = y;
        s[y] += s[x];
    }
}

void bfs()
{
    fo(i, 1, n * m) d[i] = 1e18;
    d[acs(1)] = 0;
    priority_queue <ii , vector <ii> , greater <ii>> q;
    q.push({0 , acs(1)});

    while (!q.empty())
    {
        int u = q.top().se;
        int c = q.top().fi;
        q.pop();
        for (auto v : g[u])
        {
            if (d[v] > d[u] + s[v])
            {
                d[v] = d[u] + s[v];
                q.push({d[v] , v});
            }
        }
    }
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);  cout.tie(0);
    //freopen(NAME".INP" , "r" , stdin);
    //freopen(NAME".OUT" , "w" , stdout);

    cin >> n >> m;
    int cnt = 0;
    fo(i, 1, n)
    fo(j, 1, m)
    {
        cin >> a[i][j];
        if (a[i][j] == 1) a[i][j] = 0;
        id[i][j] = ++cnt;
        p[cnt] = cnt;
        s[cnt] = a[i][j];
    }
    
    fo(i, 1, n)
    fo(j, 1, m)
    {
        if (i + 1 <= n && a[i][j] == a[i + 1][j])
            join(id[i][j] , id[i + 1][j]);

        if (j + 1 <= m && a[i][j] == a[i][j + 1])
            join(id[i][j] , id[i][j + 1]);
    }

    fo(i, 1, n)
    fo(j, 1, m)
    {
        int u = acs(id[i][j]) , v1 , v2;
        if (i + 1 <= n) v1 = acs(id[i + 1][j]);
        if (j + 1 <= m) v2 = acs(id[i][j + 1]);

        if (i + 1 <= n && acs(u) != acs(v1) && !mp[u][v1])
        {
            g[u].push_back(v1);
            g[v1].push_back(u);
            mp[u][v1] = 1;
            mp[v1][u] = 1;
            //cout << u << ' ' << v1 << '\n';
        }
        if (j + 1 <= m && acs(u) != acs(v2) && !mp[u][v2])
        {
            g[u].push_back(v2);
            g[v2].push_back(u);
            mp[u][v2] = 1;
            mp[v2][u] = 1;
            //cout << u << ' ' << v2 << '\n';
        }
    }

    bfs();

    cout << d[acs(id[n][m])];
}
// haronnee_ 