#include <bits/stdc++.h>
using namespace std;
struct path { int x, y; }; //结构体 定义坐标变量;
int main() { int f[45][45];
path t[1605]; // t表示可去的路径
int v[4][2] = { { 0, 1 }, { 1, 0 }, { -1, 0 }, { 0, -1 } }; //右 下 上 左
char c;
int i, j, n, m, k, g; // k表示当前位置,g表示能去的位置;
path start, last, mid; //出发点、终点、中间点定义为坐标变量
memset(f, 0, sizeof(f)); //先默认到处可去
cin >> n >> m;
for (i = 0; i <= n; i++) {
f[i][0] = -1;
f[i][m + 1] = -1;
}
for (i = 0; i <= m; i++) {
f[0][i] = -1;
f[n + 1][i] = -1;
}
//周围设成墙
for (i = 1; i <= n; i++) {
for (j = 1; j <= m; j++) {
cin >> c;
if (c == '#')
f[i][j] = -1; //墙用-1表示
else if (c == 'S') {
start.x = i;
start.y = j;
} //记录起点
else if (c == 'T') {
last.x = i;
last.y = j;
} //记录终点
}
}
t[0].x = start.x;
t[0].y = start.y; //初始化,起点肯定是可去的路径
k = 0;
g = 0; // k表示当前位置 g表示能去的位置;
while ((t[k].x != last.x || t[k].y != last.y) && k <= g) //当前位置与终点不重合且后面有路径可去;
{
for (i = 0; i < 4; i++) {
mid.x = t[k].x + v[i][0]; //计算中转点x坐标
mid.y = t[k].y + v[i][1]; //计算中转点y坐标
if (f[mid.x][mid.y] == 0) //如果中转点可以去
{
f[mid.x][mid.y] = f[t[k].x][t[k].y] + 1; //中转点的步数等于原来的步数+1
g++; //可去的地方就增加了
t[g].x = mid.x;
t[g].y = mid.y; //把中转点设置为可去的点
}
}
k++; //当前位置走完了,去下个能去的位置试试
}
if (f[last.x][last.y] != 0) //如果走的到
cout << f[last.x][last.y] << endl;
else
cout << "-1" << endl; //走不到就数字不会变
return 0;
}