#include <bits/stdc++.h>
using namespace std;
char a[150][150];
//存储到达每个点最少需要多少步
int d[150][150];
//s1,s2,t1,t2:表示入口和出口
int m,n,s1,s2,t1,t2;
//递归求步数
void fun(int dep,int i,int j){
if(dep < d[i][j]){
d[i][j] = dep;
if(a[i-1][j] == '.' || a[i-1][j] == 'T') fun(dep+1,i-1,j);
if(a[i+1][j] == '.' || a[i+1][j] == 'T') fun(dep+1,i+1,j);
if(a[i][j-1] == '.' || a[i][j-1] == 'T') fun(dep+1,i,j-1);
if(a[i][j+1] == '.' || a[i][j+1] == 'T') fun(dep+1,i,j+1);
}
}
int main(){
int i,j;
cin>>n>>m;
//.表示能走,#表示不能走
for(i = 1;i <= n;i++){
for(j = 1;j <= m;j++){
cin>>a[i][j];
if(a[i][j] == 'S'){
s1 = i;
s2 = j;
}else if(a[i][j] == 'T'){
t1 = i;
t2 = j;
}
d[i][j] = INT_MAX;
}
}
fun(1,s1,s2);
// for(i = 1;i <= n;i++){
// for(j = 1;j <= m;j++){
// cout<<d[i][j]<<" ";
// }
// cout<<endl;
// }
//本题开始不算一步
cout<<d[t1][t2] - 1<<endl;
}
/**************************************************************
Problem: 1433
User: admin
Language: C++
Result: Accepted
Time:27 ms
Memory:2184 kb
****************************************************************/