/**
 *    author:  mamion
 *    created: Saturday 2024-10-26
**/

#include<bits/stdc++.h>
using namespace std;

#ifdef LOCAL
#include<cpp-dump-main/cpp-dump.hpp>
#define debug(...) cpp_dump(__VA_ARGS__)
CPP_DUMP_SET_OPTION_GLOBAL(max_line_width, 100);
CPP_DUMP_SET_OPTION_GLOBAL(log_label_func, cpp_dump::log_label::filename());
CPP_DUMP_SET_OPTION_GLOBAL(enable_asterisk, true);
#else
#define debug(...)
#endif // LOCAL

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

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

const int N = 2e5 + 100;
int m, n, d[N], ans;
char c[N];

inline int get(int x, int y) {
    return (x - 1) * n + y;
}

void dijkstra(int state) {
    memset(d, 0x3f, sizeof d);
    priority_queue<pair<int, pair<int, int>>> pq;

    if (state == 0)
        for (int i = 1; i <= n; i++) {
            int ij = get(1, i);
            if ('0' <= c[ij] && c[ij] <= '9')
                d[ij] = c[ij] - '0', pq.push({-d[ij], {1, i}});
        }

    if (state == 1)
        for (int i = 1; i <= m; i++) {
            int ij = get(i, 1);
            if ('0' <= c[ij] && c[ij] <= '9')
                d[ij] = c[ij] - '0', pq.push({-d[ij], {i, 1}});
        }

    while (pq.size()) {
        int dist, u, v, uv;
        dist = -pq.top().first; tie(u, v) = pq.top().second; pq.pop();
        uv = get(u, v);
        if (dist != d[uv]) continue;
        for (int i = 0; i < 8; i++) {
            int x = u + dx[i], y = v + dy[i];
            if (x < 1 || m < x) continue;
            if (y < 1 || n < y) continue;
            int xy = get(x, y);
            if (c[xy] < '0' || '9' < c[xy]) continue;
            if (d[xy] > d[uv] + c[xy] - '0') {
                d[xy] = d[uv] + c[xy] - '0';
                pq.push({-d[xy], {x, y}});
            }
        }
    }

    if (state == 0) {
        for (int i = 1; i <= n; i++) {
            int ij = get(m, i);
            ans = min(ans, d[ij]);
        }
        for (int i = 1; i <= m; i++) {
            int ij = get(i, 1);
            ans = min(ans, d[ij]);
        }
    }
    if (state == 1) {
        for (int i = 1; i <= n; i++) {
            int ij = get(1, i);
            ans = min(ans, d[ij]);
        }
        for (int i = 1; i <= m; i++) {
            int ij = get(i, n);
            ans = min(ans, d[ij]);
        }
    }
}

void solve() {
    cin >> m >> n;
    for (int i = 1; i <= m; i++) for (int j = 1; j <= n; j++) {
        int ij = get(i, j);
        cin >> c[ij];
        if (c[ij] == '#') c[ij] = '0';
    }
    ans = 1e9;
    dijkstra(0);
    dijkstra(1);
    cout << (ans == 1e9 ? -1 : ans);
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

#ifdef LOCAL
    freopen("main.inp", "r", stdin);
    freopen("main.out", "w", stdout);
#else
    #define file "name"
    if (fopen(file".inp", "r")) {
        freopen(file".inp", "r", stdin);
        freopen(file".out", "w", stdout);
    }
#endif // LOCAL

    int T; T = 1; if (0) cin >> T;
    for (int i = 1; i <= T; i++)
    {
        solve();
    }
}
