#include<stdio.h>
#define INF 100000
int dy[9]={1,1,1,1,1,2,2,2,3};
int dx[9]={2,1,0,-1,-2,1,0,-1,0};
int d[2][60][30];
int cost[60][30];
bool used[2][60][30];
int w,h;
bool check(int i,int j,int k){
	if(j>=0&&j<h&&k>=0&&k<w&&!used[i][j][k]&&cost[j][k]!=-1)return true;
	return false;
}
int min(int a,int b){return a<b?a:b;}
int main(){
	while(1){
	scanf("%d %d",&w,&h);
	if(w==0)return 0;
	int i,j,k;
	for(i=0;i<h;i++){
		for(j=0;j<w;j++){
			d[0][i][j]=INF;
			d[1][i][j]=INF;
			used[0][i][j]=false;
			used[1][i][j]=false;
			cost[i][j]=-1;
			char c;
			scanf(" %c",&c);
			if(c=='T')cost[i][j]=0;
			else if(c=='S'){
				d[0][i][j]=0;
				d[1][i][j]=0;
			}
			else if(c!='X')cost[i][j]=c-'0';
		}
	}
	while(1){
		int ni=-1,nj,nk;
		for(i=0;i<2;i++)for(j=0;j<h;j++)for(k=0;k<w;k++)if(!used[i][j][k]&&(ni==-1||d[i][j][k]<d[ni][nj][nk])){ni=i;nj=j;nk=k;}
		if(ni==-1)break;
		used[ni][nj][nk]=true;
		for(i=0;i<9;i++){
			int x=nj+dx[i];
			int y=nk;
			if(ni==0)y+=dy[i];
			else y-=dy[i];
			if(check((ni+1)%2,x,y)){
				if(d[(ni+1)%2][x][y]>d[ni][nj][nk]+cost[x][y]){
					d[(ni+1)%2][x][y]=d[ni][nj][nk]+cost[x][y];
				}
			}
		}
	}
	int ans=INF;
	for(i=0;i<h;i++){
		for(j=0;j<w;j++){
			if(cost[i][j]==0){
				ans=min(ans,d[0][i][j]);
				ans=min(ans,d[1][i][j]);
			}
		}
	}
	if(ans==INF)printf("-1\n");
	else printf("%d\n",ans);
	}
}