#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

#define ls rt<<1
#define rs rt<<1|1
#define lb(x) (x&-x)
typedef pair<int,int> pii;
const int maxn = 2e4 + 10;
const int maxm = 5e6 + 10 ;
const int inf=0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fLL;
const int st=(1<<20)-1;
const int mod = 1e9+7;
const double eps = 1e-5;
const int vec[2][2]={1,0,0,1};

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<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}

struct edge{
    int to,w,n;
}e[maxm];
int head[maxn],tot=1,s=0,t=20005;
inline void add(int x,int y,int w) {
    e[++tot].to=y;
    e[tot].n=head[x];
    e[tot].w=w;
    head[x]=tot;

    e[++tot].to=x;
    e[tot].n=head[y];
    e[tot].w=0;
    head[y]=tot;
}
char ch[105][105];
int dis[maxn];
queue<int> q;
int dfs(int u,int del) {
    if(u==t) return del;
    int ret=0;
    for(int i=head[u];i&&del;i=e[i].n) {
        int v=e[i].to;
        if(e[i].w&&dis[v]==dis[u]+1) {
            int d=dfs(v,min(e[i].w,del));
            e[i].w-=d;
            e[i^1].w+=d;
            del-=d;
            ret+=d;
        }
    }
    return ret;
}
bool bfs() {
    memset(dis,0,sizeof dis);
    dis[s]=1;
    q.push(s);
    while(!q.empty()) {
        int u=q.front();
        q.pop();
        for(int i=head[u];i;i=e[i].n) {
            int v=e[i].to;
            if(e[i].w&&!dis[v]) {
                q.push(v);
                dis[v]=dis[u]+1;
            }
        }
    }
    return dis[t]!=0;
}
int dinic() {
    int ret=0;
    while(bfs()) {
        ret+=dfs(s,inf);
    }
    return ret;
}
int main() {
#ifdef LOCAL
    freopen("input.txt","r",stdin);
#endif // LOCAL
    ios::sync_with_stdio(false);
    cin.tie(0);
    int h,w,n;
    int pos;
    cin>>h>>w;
    n=h*w;
    for(int i=0;i<h;i++) {
        cin>>ch[i];
    }
    for(int i=0;i<h;i++) {
        for(int j=0;j<w;j++) {
            pos=i*w+j+1;
            if(ch[i][j]=='o') {
                add(pos,pos+n,1);
                for(int k=0;k<w;k++) {
                    if(k==j) continue;
                    if(ch[i][k]=='o') add(pos+n,pos-j+k,inf);
                    else if(ch[i][k]=='T') add(pos+n,t,inf);
                }
                for(int k=0;k<h;k++) {
                    if(k==i) continue;
                    if(ch[k][j]=='o') add(pos+n,pos-(i-k)*w,inf);
                    else if(ch[k][j]=='T') add(pos+n,t,inf);
                }
            }
            else if(ch[i][j]=='S') {
                for(int k=0;k<w;k++) {
                    if(ch[i][k]=='o') add(s,pos-j+k,inf);
                    else if(ch[i][k]=='T') {
                        cout<<-1;
                        return 0;
                    }
                }
                for(int k=0;k<h;k++) {
                    if(ch[k][j]=='o') add(s,pos-(i-k)*w,inf);
                    else if(ch[k][j]=='T') {
                        cout<<-1;
                        return 0;
                    }
                }
            }
        }
    }
    cout<<dinic();
    return 0;
}
//校园网真tm卡


Measured memory_bytes: 47360