// https://atcoder.jp/contests/arc074/tasks/arc074_d
// 
#include<bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define is_in(i, s) (s.find(i) != s.end())
#define all(x) (x).begin(),(x).end()
#define outl(x) cout<<x<<endl
#define outsp(x) cout<<x<<" "
typedef long long ll;
typedef pair<int,int> P;

#define MAX_V 205
const int INF = 1e9;
struct EDGE{int to,cap,rev;}; // revはノードtoの逆方向エッジのインデックス
vector<EDGE> es[MAX_V];
bool used[MAX_V];

void add_edge(int from,int to,int cap){
	// from から to へ容量 cap のエッジを追加
	es[from].push_back(EDGE{to,cap,(int)es[to].size()});
	es[to].push_back(EDGE{from,0,(int)es[from].size()-1});
}

int dfs(int i,int t,int f){
	// ノードiからノードtに流量fを入力したときに実際にtに届く流量を返す
	if(i==t) return f;
	used[i] = true;
	rep(j,es[i].size()){
		EDGE &e = es[i][j];
		if(!used[e.to] && e.cap>0){
			int d = dfs(e.to,t,min(f,e.cap));
			if(d>0){
				e.cap -= d;
				es[e.to][e.rev].cap += d;
				return d;
			}
		}
	}
	return 0;
}

int max_flow(int s,int t){
	// s から t までの最大流量を求める
	int flow = 0;
	while(true){
		memset(used,0,sizeof(used));
		int d = dfs(s,t,INF);
		if(d==0)return flow;
		flow += d;
	}
	return -1;
}

int main() {
	int H,W;
	cin >> H >> W;
	int s=H+W,t=H+W+1;
	rep(i,H){
		string row;
		cin >> row;
		rep(j,W){
			char c = row[j];
			if(c=='S'){
				add_edge(s,i,INF);
				add_edge(s,H+j,INF);
			}else if(c=='T'){
				add_edge(i,t,INF);
				add_edge(H+j,t,INF);

			}else if(c=='o'){
				add_edge(i,H+j,1);
				add_edge(H+j,i,1);
			}
		}
	}
	int ans = max_flow(s,t);
	if(ans>=INF)ans=-1;
	outl(ans);
    return 0;
}

