//构图 每个人到每个房子的距离
#include <iostream>
#include <queue>
using namespace std;
#define inf 1000000000
#define _clr(x) memset(x,0xff,sizeof(int)*n)
const int MAXN = 110;
int n, m;
char map[MAXN][MAXN];
int fuck[MAXN][MAXN];
int match1[MAXN];
int match2[MAXN];
typedef struct
{
int x, y;
}Node;
Node mem[MAXN], home[MAXN];
int abst(int x)
{
if (x < 0)
{
x = -x;
}
return x;
}
int kuhn_munkras(int m,int n,int mat[][MAXN])
{
int s[MAXN],t[MAXN],l1[MAXN],l2[MAXN],p,q,ret=0,i,j,k;
for (i=0;i<m;i++)
for (l1[i]=-inf,j=0;j<n;j++)
l1[i]=mat[i][j]>l1[i]?mat[i][j]:l1[i];
for (i=0;i<n;l2[i++]=0);
for (_clr(match1),_clr(match2),i=0;i<m;i++){
for (_clr(t),s[p=q=0]=i;p<=q&&match1[i]<0;p++)
for (k=s[p],j=0;j<n&&match1[i]<0;j++)
if (l1[k]+l2[j]==mat[k][j]&&t[j]<0){
s[++q]=match2[j],t[j]=k;
if (s[q]<0)
for (p=j;p>=0;j=p)
match2[j]=k=t[j],p=match1[k],match1[k]=j;
}
if (match1[i]<0){
for (i--,p=inf,k=0;k<=q;k++)
for (j=0;j<n;j++)
if (t[j]<0&&l1[s[k]]+l2[j]-mat[s[k]][j]<p)
p=l1[s[k]]+l2[j]-mat[s[k]][j];
for (j=0;j<n;l2[j]+=t[j]<0?0:p,j++);
for (k=0;k<=q;l1[s[k++]]-=p);
}
}
for (i=0;i<m;i++)
ret+=mat[i][match1[i]];
return ret;
}
int main()
{
while (scanf("%d %d", &n, &m) != EOF)
{
if (n == 0 && m == 0)
{
break;
}
memset(mem, -1, sizeof(mem));
memset(home,-1,sizeof(home));
int i, j;
int mem_num = 0, home_num = 0;
for (i = 0; i < n; ++i)
{
getchar();
for (j = 0; j < m; ++j)
{
scanf("%c", &map[i][j]);
if (map[i][j] == 'm')
{
mem[mem_num].x = i;
mem[mem_num++].y = j;
}
else if(map[i][j] == 'H')
{
home[home_num].x = i;
home[home_num++].y = j;
}
}
}
for (i = 0; i < mem_num; ++i)
{
for (j = 0; j < home_num; ++j)
{
fuck[i][j] = abst(mem[i].x - home[j].x) + abst(mem[i].y-home[j].y);
fuck[i][j] = -fuck[i][j];
}
}
int result = -kuhn_munkras(mem_num,home_num,fuck);
printf("%d\n", result);
}
return 0;
}