#include <iostream>
#include <queue>
using namespace std;
int n, m;
bool vis[105][105];
char mp[105][105];

int dx[8] = {-2, -1, -2, -1, 1, 2, 2, 1}, dy[8] = {-1, -2, 1, 2, -2, -1, 1, 2};
struct Edge {
	int x, y, w;
};
queue<Edge> que;
bool check(int x, int y) {
	if (x > 0 && y > 0 && x <= m && y <= n && !vis[x][y] && mp[x][y] != '*')
		return true;
	return false;
}
int bfs(){
	while (!que.empty()) {
		Edge p = que.front();
		que.pop();
		if (mp[p.x][p.y] == 'H') {
			return p.w;
		}
		if (vis[p.x][p.y])
			continue;
		vis[p.x][p.y] = 1;
		for (int i = 0; i < 8; i++) {
			int nx = p.x + dx[i], ny = p.y + dy[i];
			if (check(nx, ny)) {
				que.push({nx, ny, p.w + 1});
			}
		}
	}
	return -1;
}
int main() {
	cin>>n>>m;
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= n; j++) {
			cin >> mp[i][j];
			if (mp[i][j] == 'K') {
				que.push({i, j, 0});
			}
		}
	}
	cout<<bfs();
	return 0;
}