#include <iostream>
#include <queue>
#include <set>
using namespace std;
const int N = 1005;
set<pair<int, int>> row[N], col[N], dg1[N<<1], dg2[N<<1];
vector<pair<int, int>> vec[10], vc;
int Mn[N][N];
char a[N][N];
pair<int, int> nxt[9][N][N];
int n, m, r1, c1, r2, c2;
void erase(int i, int j, int t = 0){
row[i].erase({i, j});
col[j].erase({i, j});
dg1[i+j].erase({i, j});
dg2[i-j+m].erase({i, j});
}
string print(pair<int, int> p){
string ans = "{";
ans += to_string(p.first);
ans += ",";
ans += to_string(p.second);
ans += "}";
return ans;
}
void bfs(int x, int y){
erase(x, y);
Mn[x][y] = 0;
queue<pair<int, int>> Q;
Q.push({x, y});
while (Q.size() > 0){
auto [r, c] = Q.front();
Q.pop();
vc = {};
auto u = row[r].upper_bound(nxt[2][r][c]);
while (u != row[r].end() and *u < nxt[4][r][c])
vc.push_back(*u), u = next(u);
u = col[c].upper_bound(nxt[1][r][c]);
while (u != col[c].end() and *u < nxt[3][r][c])
vc.push_back(*u), u = next(u);
u = dg1[r+c].upper_bound(nxt[8][r][c]);
while (u != dg1[r+c].end() and *u < nxt[6][r][c])
vc.push_back(*u), u = next(u);
u = dg2[m+r-c].upper_bound(nxt[5][r][c]);
while (u != dg2[m+r-c].end() and *u < nxt[7][r][c])
vc.push_back(*u), u = next(u);
while (vc.size() > 0){
auto [i, j] = vc.back();
vc.pop_back();
if (isdigit(a[i][j]))
vc.insert(vc.end(), vec[a[i][j] - '0'].begin(), vec[a[i][j] - '0'].end()), vec[a[i][j] - '0'].clear();
if (Mn[i][j] == 1e9)
Mn[i][j] = Mn[r][c] + 1, erase(i, j), Q.push({i, j});
}
}
}
int main(){
cin>>n>>m;
for (int i=0;i<=n+1;i++){
for (int j=0;j<=m+1;j++)
a[i][j] = '#', Mn[i][j] = 1e9;
}
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
cin>>a[i][j];
if (a[i][j] != '#'){
row[i].insert({i, j});
col[j].insert({i, j});
dg1[i+j].insert({i, j});
dg2[i-j+m].insert({i, j});
}
if (isdigit(a[i][j]))
vec[a[i][j] - '0'].push_back({i, j});
if (a[i][j] == 'S')
r1 = i, c1 = j;
if (a[i][j] == 'E')
r2 = i, c2 = j;
}
}
for (int i=0;i<=n+1;i++){
for (int j=0;j<=m+1;j++){
if (a[i][j] == '#')
nxt[1][i][j] = nxt[2][i][j] = nxt[5][i][j] = nxt[8][i][j] = {i, j};
else{
nxt[1][i][j] = nxt[1][i-1][j];
nxt[2][i][j] = nxt[2][i][j-1];
nxt[5][i][j] = nxt[5][i-1][j-1];
nxt[8][i][j] = nxt[8][i-1][j+1];
}
}
}
for (int i=n+1;i>=0;i--){
for (int j=m+1;j>=0;j--){
if (a[i][j] == '#')
nxt[3][i][j] = nxt[4][i][j] = nxt[6][i][j] = nxt[7][i][j] = {i, j};
else{
nxt[3][i][j] = nxt[3][i+1][j];
nxt[4][i][j] = nxt[4][i][j+1];
nxt[6][i][j] = nxt[6][i+1][j-1];
nxt[7][i][j] = nxt[7][i+1][j+1];
}
}
}
bfs(r1, c1);
if (Mn[r2][c2] == 1e9)
cout<<-1<<'\n';
else
cout<<Mn[r2][c2]<<endl;
}