#include<stdio.h>
#include<queue>
#include<iostream>
#define INF 1000000000
#define N 1005
using namespace std;
int list[N],dis[N],hx[N],hy[N],px[N],py[N],tot,pre[N],pr[N];
char map[205][205];
struct dian
{
   int date,value,next,cost;    
}cun[2000005];
void add(int a,int b,int c,int d)
{
   cun[++tot].date=b;
   cun[tot].value=c;
   cun[tot].next=list[a];
   cun[tot].cost=d;
   list[a]=tot;    
   cun[++tot].date=a;
   cun[tot].value=0;
   cun[tot].next=list[b];
   cun[tot].cost=-d;
   list[b]=tot;
}
int abss(int a)
{
   if(a>0)  return a;
   return -a;    
}
int spfa(int s,int t)
{
   queue<int> p;
   int vis[N];
   for(int i=0;i<1005;i++)
     {
      dis[i]=INF;
      vis[i]=0;
      pre[i]=-1;    
     }
   dis[s]=0;
   p.push(s);
   int k;
   while(!p.empty())
     {
         k=p.front();
         p.pop();
         vis[k]=0;
         for(int i=list[k];i;i=cun[i].next)
            {
              int w=cun[i].value;
              int c=cun[i].cost;
              int to=cun[i].date;
              if(w>0&&dis[to]>dis[k]+c)
                 {
                    dis[to]=dis[k]+c;
                    pre[to]=k;
                    pr[to]=i;
                    if(!vis[to])
                       {
                        vis[to]=1;
                        p.push(to);        
                       }        
                 }    
            }           
     }
   if(dis[t]>=INF)  return 0;
   return 1; 
}
int maxflow(int s,int t)
{
   int min=INF;
   int sum=0;
   while(spfa(s,t))
   {
    for(int i=t;i!=s;i=pre[i])
      {
         if(min<cun[pr[i]].value)
            min=cun[pr[i]].value;        
      }    
    for(int i=t;i!=s;i=pre[i])
      {
         cun[pr[i]].value-=min;
         cun[pr[i]^1].value+=min;        
      }
    sum+=dis[t];
   }
 return sum;  
}
void clear()
{
   memset(list,0,sizeof(list));
   tot=1;    
}
int main()
{
   int n,m;
   while(scanf("%d%d",&n,&m)!=EOF)
     {
          if(n==0&&m==0)  break;
          getchar();
          clear();
          int count,kk;
          count=kk=1;
          for(int i=1;i<=n;i++)
           {
            for(int j=1;j<=m;j++)
                {
                    scanf("%c",&map[i][j]);
                    if(map[i][j]=='H')   {hx[count]=i; hy[count++]=j;}
                    if(map[i][j]=='m')    {px[kk]=i; py[kk++]=j;}
                } 
            getchar();
           }  
          for(int i=1;i<kk;i++)
           {
             add(1,i+1,1,0);
             for(int j=1;j<count;j++)
                {
                   int w=abss(hx[i]-px[j])+abs(hy[i]-py[j]);
                   add(i+1,count+1+j,1,w);
                }
           }
          for(int i=1;i<count;i++)
           {
             add(count+1+i,2*count+10,1,0);        
           }
          printf("%d\n",maxflow(1,2*count+10));
     }    
}