#include<bits/stdc++.h>
#define inf 1000000000
#define N 209
#define M 30009
using namespace std;

int m,n,tot=1,gol,fst[N],cur[N],pnt[M],len[M],nxt[M],d[N],h[N];
char ch[N];
void add(int x,int y,int z){
	pnt[++tot]=y; len[tot]=z; nxt[tot]=fst[x]; fst[x]=tot;
}
bool bfs(){
	int head=0,tail=1,i,x,y; h[1]=0;
	memset(d,-1,sizeof(d)); d[0]=1;
	memcpy(cur,fst,sizeof(fst));
	while (head<tail){
		x=h[++head];
		for (i=fst[x]; i; i=nxt[i]) if (len[i]){
			y=pnt[i];
			if (d[y]==-1){
				d[y]=d[x]+1; h[++tail]=y;
			}
		}
	}
	return d[gol]!=-1;
}
int dfs(int x,int rst){
	if (x==gol || !rst) return rst;
	int &i=cur[x],y,tmp,flow=0;
	for (; i; i=nxt[i]) if (len[i]){
		y=pnt[i];
		if (d[x]+1==d[y] && (tmp=dfs(y,min(rst,len[i])))){
			flow+=tmp; len[i]-=tmp;
			len[i^1]+=tmp; rst-=tmp;
			if (!rst) break;
		}
	}
	if (!flow) d[x]=-1; return flow;
}
void check(int &x,int &y,int i,int j){
	if (x==-1){
		x=i; y=j;
	} else if (x==i || y==j){
		puts("-1"); exit(0);
	}
}
int main(){
	scanf("%d%d",&m,&n);
	int i,j,x=-1,y;
	gol=m+n+1;
	for (i=1; i<=m; i++){
		scanf("%s",ch+1);
		for (j=1; j<=n; j++) if (ch[j]=='o'){
			add(i,j+m,1); add(j+m,i,1);
		} else if (ch[j]=='S'){
			check(x,y,i,j);
			add(0,i,inf); add(i,0,0);
			add(0,j+m,inf); add(j+m,0,0);
		} else if (ch[j]=='T'){
			check(x,y,i,j);
			add(i,gol,inf); add(gol,i,0);
			add(j+m,gol,inf); add(gol,j+m,0);
		}
	}
	int flow=0;
	while (bfs()) flow+=dfs(0,gol);
	printf("%d\n",flow);
	return 0;
}
