#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
****************************************************************/