#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<algorithm>
#include<functional>
#include<cstring>
#include<deque>
using namespace std;

char map[1001][1001];
int dis[1001][1001];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
struct pos{
    int x,y,w;
    pos(){};
    pos(int _x,int _y,int _w){x=_x;y=_y;w=_w;}
};
int main()
{
    int H,W;
    while(~scanf("%d%d",&H,&W))
    {
        gets(map[0]);
        for(int i=0;i<H;++i)
            gets(map[i]);
        int x,y;
        for(int i=0;i<H;++i)
            for(int j=0;j<W;++j)
                if(map[i][j]=='E'){
                    x=i;y=j;
                }
        queue<pos> qu;
        qu.push(pos(x,y,0));
        memset(dis,0x3f,sizeof(dis));
        dis[x][y]=0;
        while(!qu.empty())
        {
            pos t=qu.front();qu.pop();
            for(int i=0;i<4;++i){
                int nx=t.x+dx[i];
                int ny=t.y+dy[i];
                int nw=t.w+1;
                if(nx<0||H<=nx||ny<0||W<=ny)continue;
                if(map[nx][ny]=='T')continue;
                if(dis[nx][ny]==0x3f3f3f3f){
                    dis[nx][ny]=nw;
                    qu.push(pos(nx,ny,nw));
                }
            }
        }
        /*puts("D");
        for(int p=0;p<H;++p){
            for(int j=0;j<W;++j)
                cout<<dis[p][j]<<' ';
            cout<<endl;
        }
        cout<<endl;*/
        for(int i=0;i<H;++i)
            for(int j=0;j<W;++j)
                if(map[i][j]=='S'){
                    x=i;y=j;
                }
        int lim=dis[x][y],ans=0;
        for(int i=0;i<H;++i)
            for(int j=0;j<W;++j)
                if('1'<=map[i][j]&&map[i][j]<='9')
                    if(dis[i][j]<=lim)
                        ans+=map[i][j]-'0';
        printf("%d\n",ans);
    }
    return 0;
}