#include <bits/stdc++.h>
#define inf 100000000000000ll
#define int long long
using namespace std;

struct edge{int next,v,w,u;}vs[500001];
int ee=1,S,T;
int h[60001],st[60001];
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
inline void addedge(int u,int v,int w){vs[++ee].v=v;vs[ee].u=u;vs[ee].next=st[u];vs[ee].w=w;st[u]=ee;}
void insert(int u,int v,int w){addedge(u,v,w);addedge(v,u,0);}
bool bfs(){
    memset(h,-1,sizeof(h));
    queue <int> q;q.push(0);h[0]=1;
    while(!q.empty()){
        int lx=q.front();q.pop();
        for(int i=st[lx];i;i=vs[i].next)
            if(vs[i].w&&h[vs[i].v]==-1){
                q.push(vs[i].v);
                h[vs[i].v]=h[lx]+1;
            }
    }
    return h[T]!=-1;
}
int dfs(int x,int f){
    if(x==T) return f;
    int w,used=0;
    for(int i=st[x];i;i=vs[i].next)
        if(vs[i].w&&h[vs[i].v]==h[x]+1){
            w=dfs(vs[i].v,min(f-used,vs[i].w));
            vs[i].w-=w;vs[i^1].w+=w;
            used+=w;if(used==f)return f;
        }
    if(!used)h[x]=-1;
    return used;
}

char sd[200]; int H,W,ans,sx,sy,ex,ey;
signed main()
{
	H=read(); W=read(); S=0; T=H+W+1;
	for(int i=1;i<=H;i++)
	{
		scanf("%s",sd);
		for(int j=1;j<=strlen(sd);j++)
		{
			if(sd[j-1]=='o')
			{
				addedge(i,j+H,1); addedge(j+H,i,1);
			}
			if(sd[j-1]=='S')
			{
				insert(0,i,inf); insert(0,j+H,inf);
				sx=i; sy=j;
			}
			if(sd[j-1]=='T')
			{
				insert(i,H+W+1,inf); insert(j+H,H+W+1,inf);
				ex=i; ey=j;
			}
		}
	}
	//	if(ex==sx||ey==sy) {printf("-1\n"); return 0;}
	//for(int i=2;i<=ee;i++) printf("%d %d %d\n",vs[i].u,vs[i].v,vs[i].w);
	while(bfs()) ans+=dfs(S,inf);
	if(ans>H*W+100) printf("-1\n");
	else cout << ans << endl; return 0;
}