#include<cstdio> 
#include<cstring> 
const int MAX_E=20005,MAX_V=205,INF=1e7; 
struct edge{ 
    int to,cap,rev,next; 
}g[2*MAX_E]; 
int k=0,h[MAX_V],level[MAX_V],iter[MAX_V],head=0,tail=0,q[MAX_V],n,m,S,T;
char map[105][105]; 
void add(int u,int v,int cap){ 
    g[++k].next=h[u]; h[u]=k; 
    g[k].to=v; g[k].cap=cap; g[k].rev=k+1; 
    g[++k].next=h[v]; h[v]=k; 
    g[k].to=u; g[k].cap=0; g[k].rev=k-1; 
} 
void bfs(int s){ 
    head=tail=0; 
    q[tail++]=s; level[s]=1; 
    while(head!=tail){ 
        int u=q[head]; 
        for(int i=h[u];i;i=g[i].next){ 
            if(!level[g[i].to]&&g[i].cap){ 
                level[g[i].to]=level[u]+1; 
                q[tail++]=g[i].to; 
            } 
        } 
        head++; 
    } 
} 
int dfs(int u,int t,int f){ 
    if(u==t) return f; 
    for(int &i=iter[u];i;i=g[i].next){ 
        if(level[g[i].to]==level[u]+1&&g[i].cap){ 
            int d=dfs(g[i].to,t,f<g[i].cap?f:g[i].cap); 
            if(d){ 
                g[i].cap-=d; 
                g[g[i].rev].cap+=d; 
                return d; 
            } 
        } 
    } 
    return 0; 
} 
int max_flow(int s,int t){ 
    int flow=0; 
    for(;;){ 
        for(int i=1;i<=n+m+2;++i) iter[i]=h[i]; 
        memset(level,0,sizeof(level)); 
        bfs(s); 
        if(level[t]==0) return flow; 
        int d=dfs(s,t,INF); 
        while(d>0){ 
            flow+=d; 
            d=dfs(s,t,INF); 
        } 
    } 
} 
int main(){
	scanf("%d%d",&n,&m);
	S=n+m+1,T=n+m+2;
	for(int i=1;i<=n;++i) scanf("%s",map[i]+1);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j){
            if(map[i][j]!='.') add(i,j+n,1),add(j+n,i,1);
            if(map[i][j]=='S') add(S,i,INF),add(S,j+n,INF);
            else if(map[i][j]=='T') add(i,T,INF),add(j+n,T,INF);
        }
    int ans=max_flow(S,T);
    if(ans>=INF) puts("-1");
    else printf("%d\n",ans);
}