#include<bits/stdc++.h>
using namespace std;
const int maxN = 123;
const int inf = 1e9 + 7;
char G[maxN][maxN];
int times[maxN][maxN][6];
int n, m, sx, sy, ex, ey, ans;
int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
struct node {
int x, y, t, o;
bool operator < (const node& p) const {
return t > p.t;
}
};
void bfs() {
node t = (node) {
sx, sy, 0, 0
};
times[sx][sy][0] = 0;
priority_queue<node> q;
q.push(t);
while(!q.empty()) {
node u = q.top();
q.pop();
int x = u.x, y = u.y, o = u.o, t = u.t;
if(x == ex && y == ey) {
ans = min(ans, t);
return;
}
for(int d = 0; d < 4; d++) {
int tx = x + dir[d][0];
int ty = y + dir[d][1];
if(tx < 0 || tx >= n || ty < 0 || ty >= m) //越界
continue;
if(G[tx][ty] == '#') {
if(o == 0) {
continue;
} else if(times[tx][ty][o-1] > t + 2) {
q.push((node) {
tx,ty,t+2,o-1
});
times[tx][ty][o-1] = t + 2;
}
} else if(G[tx][ty] == 'P' && times[tx][ty][o] > t) {
q.push((node) {
tx,ty,t,o
});
times[tx][ty][o] = t;
} else if(G[tx][ty] == 'B' && o < 5 && times[tx][ty][o + 1] > t + 1) {
q.push((node) {
tx,ty,t+1,o+1
});
times[tx][ty][o + 1] = t + 1;
} else if(times[tx][ty][o] > t + 1) {
q.push((node) {
tx,ty,t+1,o
});
times[tx][ty][o] = t + 1;
}
}
}
}
int main() {
while(~scanf("%d %d", &n, &m)) {
if(n == 0)
break;
for(int i = 0; i < maxN; i++)
for(int j = 0; j < maxN; j++)
for(int k = 0 ; k <= 5; k++)
times[i][j][k] = inf;
for(int i = 0; i < n; i++) {
scanf("%s", G[i]);
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(G[i][j] == 'S')
sx = i, sy = j;
if(G[i][j] == 'T')
ex = i, ey = j;
}
}
ans = inf;
bfs();
if(ans == inf) {
printf("-1
");
} else {
printf("%d
", ans);
}
}
return 0;
}