#include <bits/stdc++.h>
using namespace std;
#define faster ios_base::sync_with_stdio(false); cin.tie(NULL)
#define Bit(mask , i) ((mask >> i) & 1)
#define fi first
#define se second
#define _LOG2(nl) 31 - __builtin_clz(nl)
#define c_bit(nl) __builtin_popcount(nl)
#define ii pair<long long , int>
#define lll pair<long long , pair<long long , long long>>
#define lii pair<long long , pair<int , int>>
#define iii pair<long long , pair<int , int>>
#define iiii pair<pair<long long , int> , pair<int , int>>
#define llll pair<pair<__int128 , __int128> , pair<__int128 , __int128>>
#define li pair<long long , int>
#define db long double
#define onBit(mask , i) (mask | (1 << i))
#define offBit(mask , i) (mask & (~(1 << i)))

const int INF = 1e7;
const long long MOD = 998244353;
const int N = 507;
const int MAXN = 2e5 + 5e4 + 7;
const int MAXF = 2300007;

int dx[5] = {1 , 0 , -1 , 0};
int dy[5] = {0 , 1 , 0 , -1};

char a[N][N];

int f[17][MAXN];
int w[MAXN];

int n , m;
int res = INF;
vector<int> val[MAXN];

int change(int i , int j){
    return m * (i - 1) + j;
}

void inp(){
    cin >> n >> m;

    for (int i = 1 ; i <= n ; ++i){
        for (int j = 1 ; j <= m ; ++j){
            cin >> a[i][j];
        }
    }
}

void steiner(int cur){

    const int K = 9;

    for (int i = 1 ; i <= n ; ++i){
        for (int j = 1 ; j <= m ; ++j){

            int id = change(i , j);

            w[id] = abs(a[i][j] - '0' - cur);

            for (int mask = 1 ; mask < 16 ; ++mask){
                f[mask][id] = INF;
            }

            if (i == 1) f[1][id] = w[id];
            if (i == n) f[2][id] = w[id];
            if (j == 1) f[4][id] = w[id];
            if (j == m) f[8][id] = w[id];
        }
    }

    for (int mask = 1 ; mask < 16 ; ++mask){

        for (int sub = (mask - 1) & mask ; sub ; sub = (sub - 1) & mask){
            if (sub > (sub ^ mask)){

                for (int i = 1 ; i <= n ; ++i){
                    for (int j = 1 ; j <= m ; ++j){

                        int id = change(i , j);

                        f[mask][id] = min(
                            f[mask][id],
                            f[sub][id] + f[sub ^ mask][id] - w[id]
                        );
                    }
                }
            }
        }

        if (mask == 15){

            for (int i = 1 ; i <= n ; ++i){
                for (int j = 1 ; j <= m ; ++j){

                    res = min(
                        res ,
                        f[15][change(i , j)]
                    );
                }
            }

            return;
        }

        vector<int> bucket[K + 1];

        int num = 0;

        for (int i = 1 ; i <= n ; ++i){
            for (int j = 1 ; j <= m ; ++j){

                int id = change(i , j);
                if (f[mask][id] > 9 * K) continue;
                num++;
                if (f[mask][id] <= K){

                    bucket[f[mask][id]].push_back(id);
                }

                else val[f[mask][id]].push_back(id);
            }
        }

        int pos = 0;

        while (num){
            while (bucket[pos % (K + 1)].empty() && val[pos].empty()){
                pos++;
            }

            while (val[pos].size()){
                bucket[pos % (K + 1)].push_back(val[pos].back());
                val[pos].pop_back();
            }

            int id = bucket[pos % (K + 1)].back();
            bucket[pos % (K + 1)].pop_back();

            num--;

            if (f[mask][id] != pos){
                continue;
            }

            int r = (id - 1) / m + 1;
            int c = (id - 1) % m + 1;

            for (int k = 0 ; k < 4 ; ++k){

                int u = r + dx[k];
                int v = c + dy[k];

                if (u < 1 || u > n || v < 1 || v > m) continue;

                int nid = change(u , v);

                int nd = f[mask][id] + w[nid];

                if (nd < f[mask][nid]){

                    f[mask][nid] = nd;

                    bucket[nd % (K + 1)].push_back(nid);

                    num++;
                }
            }
        }
    }
}

void solve(){

    for (int cur = 0 ; cur <= 9 ; ++cur){
        steiner(cur);
    }

    cout << res;
}

int main(){
//    freopen("difmax.inp" , "r" , stdin);
//    freopen("difmax.out" , "w" , stdout);
    faster;
    inp();
    solve();
    return 0;
}
