#include<stdio.h>
#include<stdlib.h>
#define min(x,y) (x)<(y)?x:y;
#define N 100000000
typedef struct{
    int w;
    int h;
    int leg;
}Data;
Data queue[N];
int num,head;
void enqueue(int leg,int h,int w){
    if(num<N){
        queue[(head+num)%N].w=w;
        queue[(head+num)%N].h=h;
        queue[(head+num)%N].leg=leg;
        num++;
    }else{
        printf("エラー\n");
        exit(1);
    }
}
Data dequeue(const int cost[2][62][32]){
    int index=head; Data x=queue[head];
    int min=cost[x.leg][x.h][x.w];
    for(int i=head+1;i<head+num;i++){
        if(min>cost[queue[i%N].leg][queue[i%N].h][queue[i%N].w]){
            min=cost[queue[i%N].leg][queue[i%N].h][queue[i%N].w];
            index=i%N;
        }
    }
    Data tmp=queue[head]; queue[head]=queue[index]; queue[index]=tmp;
    Data d={-1,-1,-1};
    if(num>0){
        d=queue[head];
        head=(head+1)%N;
        num--;
    }
    return d;
}
char map[62][32];
int mv[2][9][2]={{{1,2},{1,1},{1,0},{1,-1},{1,-2},{2,1},{2,0},{2,-1},{3,0}},
    {{-3,0},{-2,1},{-2,0},{-2,-1},{-1,2},{-1,1},{-1,0},{-1,-1},{-1,-2}}};
int main(void){
    while(1){
        int w,h;
        char s[10];
        scanf("%d%d",&w,&h);
        if(w+h==0) break;
        getchar();
        for(int i=0;i<h;i++){
            for(int j=0;j<w;j++){
                scanf("%s",s);
                map[i][j]=s[0];
            }
        }
        /*for(int i=0;i<h;i++){
            for(int j=0;j<w;j++){
                printf("%c ",map[i][j]);
            }puts("");
        }*/
        int ans=100000000;
        int cost[2][62][32]={0};
        for(int j=0;j<w;j++)
            if(map[h-1][j]=='S') enqueue(0,h-1,j),enqueue(1,h-1,j);
        while(1){
            int nh,nw;
            Data tmp=dequeue(cost);
            if(tmp.leg==-1) break;
            for(int i=0;i<9;i++){
                int leg=tmp.leg;
                nh=tmp.h+mv[leg][i][1];
                nw=tmp.w+mv[leg][i][0];
                if(nh<0||nh>=h||nw<0||nw>=w) continue;
                if(map[nh][nw]=='S'||map[nh][nw]=='X') continue;
                if(map[nh][nw]=='T'){
                    if(cost[!leg][nh][nw]==0||
                       cost[!leg][nh][nw]>cost[leg][tmp.h][tmp.w]){
                        cost[!leg][nh][nw]=cost[leg][tmp.h][tmp.w];
                    }
                }
                else if(cost[!leg][nh][nw]==0||
                   cost[!leg][nh][nw]>
                   cost[leg][tmp.h][tmp.w]+(map[nh][nw]-'0')){
                    cost[!leg][nh][nw]=cost[leg][tmp.h][tmp.w]+(map[nh][nw]-'0');
                    enqueue(!leg,nh,nw);
                }
            }
        }
        int min=10000000;
        for(int j=0;j<w;j++){
            if(map[0][j]=='T'){
                if(cost[0][0][j]!=0&&min>cost[0][0][j])
                    min=cost[0][0][j];
                if(cost[1][0][j]!=0&&min>cost[1][0][j])
                    min=cost[1][0][j];
            }
        }
        if(min==10000000) printf("-1\n");
        else printf("%d\n",min);
    }
}

