#include <iostream>
#include <vector>
#include <algorithm>
#include <array>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef long double ld;
#define int ll
char g[1001][1001];
int d[1001][1001][10];
//
vector<pair<int,int>> oc[300];
int32_t main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m,sx,sy,ex,ey;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>g[i][j];
for(int k=0;k<9;k++)
d[i][j][k]=1e9+10;
if(g[i][j]<='9' and g[i][j]>='1')
{
oc[g[i][j]].push_back({i,j});
}
else
{
}
if(g[i][j]=='S')
{
sx=i,sy=j;
}
else if(g[i][j]=='E')
{
ex=i,ey=j;
}
}
}
queue<array<int,3>> cur;
d[sx][sy][8]=0;
cur.push({sx,sy,8});
int dx[]={0,0,1,1,1,-1,-1,-1};
int dy[]={-1,1,-1,0,1,-1,0,1};
while(cur.size())
{
int x=cur.front()[0];
int y=cur.front()[1];
int lst=cur.front()[2];
int dt=d[x][y][lst];
cur.pop();
for(int i=0;i<8;i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(1<=nx and nx<=n and 1<=ny and ny<=m and g[nx][ny]!='#' and d[nx][ny][i]>dt+(lst!=i))
{
d[nx][ny][i]=dt+(lst!=i);
cur.push({nx,ny,i});
}
}
if('1'<=g[x][y] and g[x][y]<='9')
{
int i=8;
for(auto [nx,ny]:oc[g[x][y]])
{
if(1<=nx and nx<=n and 1<=ny and ny<=m and g[nx][ny]!='#' and d[nx][ny][i]>dt)
{
d[nx][ny][i]=dt;
cur.push({nx,ny,i});
}
}
}
}
int mi=d[ex][ey][0];
for(int i=1;i<=8;i++)mi=min(mi,d[ex][ey][i]);
if(mi>1e9)
{
cout<<-1<<endl;
}
else
{
cout<<mi<<endl;
}
}