#include"stdio.h"#include"string.h"#include"vector"#include"queue"#include"iostream"#include"algorithm"using namespace std;#define N 105const int inf=(int)1e10;int w,h,ans;char e[N][N]; int mark1[N][N],mark2[N][N]; struct node{ int x,y,t,f; };bool judge(int x,int y) { if(x>=0&&x<h&&y>=0&&y<w&&e[x][y]!='X') return true; return false;}int min(int a,int b){ return a<b?a:b;}void spfa(){ int i,j,x,y,u,v; queue<node>q; node cur,next; cur.t=0; for(i=0;i<h;i++) { for(j=0;j<w;j++) { if(e[i][j]=='S') { cur.x=i; cur.y=j; cur.f=-1; q.push(cur); cur.f=1; q.push(cur); mark1[i][j]=mark2[i][j]=0; } } } while(!q.empty()) { cur=q.front(); q.pop(); x=cur.x; y=cur.y; if(cur.f==1) { next.f=-1; for(i=-2;i<=2;i++) { for(j=-3;j<=-1;j++) { if(abs(i)+abs(j)<=3) { u=x+i;v=y+j; if(judge(u,v)) { if(e[u][v]=='T') { ans=min(ans,cur.t); continue; } next.t=cur.t+e[u][v]-'0'; if(next.t>=mark1[u][v]) continue; next.x=u; next.y=v; mark1[u][v]=next.t; q.push(next); } } } } } if(cur.f==-1) { next.f=1; for(i=-2;i<=2;i++) { for(j=1;j<=3;j++) { if(abs(i)+abs(j)<=3) { u=x+i;v=y+j; if(judge(u,v)) { if(e[u][v]=='T') { ans=min(ans,cur.t); continue; } next.t=cur.t+e[u][v]-'0'; if(next.t>=mark2[u][v]) continue; next.x=u; next.y=v; mark2[u][v]=next.t; q.push(next); } } } } } }}int main(){ int i,j; while(scanf("%d%d",&w,&h),w||h) { for(i=0;i<h;i++) { for(j=0;j<w;j++) { cin>>e[i][j]; mark1[i][j]=mark2[i][j]=inf; } } ans=inf; spfa(); if(ans>=inf) printf("-1n"); else printf("%dn",ans); } return 0;}