#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
template<typename T>
void minimize(T& a, const T& b) {
if (b < a) a = b;
}
template<typename T>
void maximize(T& a, const T& b) {
if (a < b) a = b;
}
const int N = 1e2 + 5;
int dx[2][8] = {{0, 0, -1, 1, -1, -1, 1, 1},
{-1, -1, -2, -2, 1, 1, 2, 2}};
int dy[2][8] = {{-1, 1, 0, 0, -1, 1, -1, 1},
{-2, 2, -1, 1, -2, 2, -1, 1}};
int n;
string board[N];
int kx, ky;
vector<ii> knights;
bool ok(int x, int y) {
return (1 <= x && x <= n && 1 <= y && y <= n && board[x][y] != '#');
}
struct Node {
int x, y, parity;
};
int dist[N][N][2];
int mx[N][N][2];
void bfs(int sx, int sy, int type) {
for (int x = 1; x <= n; x++) {
for (int y = 1; y <= n; y++) {
dist[x][y][0] = dist[x][y][1] = INF;
}
}
queue<Node> q;
dist[sx][sy][0] = 0;
q.push({sx, sy, 0});
while (!q.empty()) {
auto [x, y, parity] = q.front(); q.pop();
for (int i = 0; i < 8; i++) {
int nx = x + dx[type][i], ny = y + dy[type][i];
int nparity = parity ^ 1;
if (!ok(nx, ny)) continue;
if (dist[nx][ny][nparity] == INF) {
dist[nx][ny][nparity] = dist[x][y][parity] + 1;
q.push({nx, ny, nparity});
}
}
}
for (int x = 1; x <= n; x++) {
for (int y = 1; y <= n; y++) {
for (int parity = 0; parity <= 1; parity++) {
maximize(mx[x][y][parity], dist[x][y][parity]);
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int x = 1; x <= n; x++) {
cin >> board[x];
board[x] = ' ' + board[x];
for (int y = 1; y <= n; y++) {
if (board[x][y] == 'T') {kx = x; ky = y;}
if (board[x][y] == 'M') knights.push_back({x, y});
}
}
bfs(kx, ky, 0);
for (auto [sx, sy] : knights) bfs(sx, sy, 1);
int ans = INF;
for (int x = 1; x <= n; x++) {
for (int y = 1; y <= n; y++) {
for (int parity = 0; parity <= 1; parity++) {
minimize(ans, mx[x][y][parity]);
}
}
}
if (ans == INF) ans = -1;
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCBtaW5pbWl6ZShUJiBhLCBjb25zdCBUJiBiKSB7CglpZiAoYiA8IGEpIGEgPSBiOyAKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCBtYXhpbWl6ZShUJiBhLCBjb25zdCBUJiBiKSB7CglpZiAoYSA8IGIpIGEgPSBiOyAgCn0KCmNvbnN0IGludCBOID0gMWUyICsgNTsgCgppbnQgZHhbMl1bOF0gPSB7ezAsIDAsIC0xLCAxLCAtMSwgLTEsIDEsIDF9LCAKCQkJCXstMSwgLTEsIC0yLCAtMiwgMSwgMSwgMiwgMn19OyAKCmludCBkeVsyXVs4XSA9IHt7LTEsIDEsIDAsIDAsIC0xLCAxLCAtMSwgMX0sIAoJCQkJey0yLCAyLCAtMSwgMSwgLTIsIDIsIC0xLCAxfX07CgppbnQgbjsgCnN0cmluZyBib2FyZFtOXTsgCmludCBreCwga3k7ICAKdmVjdG9yPGlpPiBrbmlnaHRzOyAKCmJvb2wgb2soaW50IHgsIGludCB5KSB7CglyZXR1cm4gKDEgPD0geCAmJiB4IDw9IG4gJiYgMSA8PSB5ICYmIHkgPD0gbiAmJiBib2FyZFt4XVt5XSAhPSAnIycpOwp9CgpzdHJ1Y3QgTm9kZSB7CglpbnQgeCwgeSwgcGFyaXR5OyAKfTsgCgppbnQgZGlzdFtOXVtOXVsyXTsKaW50IG14W05dW05dWzJdOwoKdm9pZCBiZnMoaW50IHN4LCBpbnQgc3ksIGludCB0eXBlKSB7Cglmb3IgKGludCB4ID0gMTsgeCA8PSBuOyB4KyspIHsKCQlmb3IgKGludCB5ID0gMTsgeSA8PSBuOyB5KyspIHsKCQkJZGlzdFt4XVt5XVswXSA9IGRpc3RbeF1beV1bMV0gPSBJTkY7CgkJfQoJfQoJcXVldWU8Tm9kZT4gcTsKCWRpc3Rbc3hdW3N5XVswXSA9IDA7ICAKCXEucHVzaCh7c3gsIHN5LCAwfSk7IAoKCXdoaWxlICghcS5lbXB0eSgpKSB7CgkJYXV0byBbeCwgeSwgcGFyaXR5XSA9IHEuZnJvbnQoKTsgcS5wb3AoKTsgIAoJCWZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7CgkJCWludCBueCA9IHggKyBkeFt0eXBlXVtpXSwgbnkgPSB5ICsgZHlbdHlwZV1baV07IAoJCQlpbnQgbnBhcml0eSA9IHBhcml0eSBeIDE7IAoJCQlpZiAoIW9rKG54LCBueSkpIGNvbnRpbnVlOwoJCQlpZiAoZGlzdFtueF1bbnldW25wYXJpdHldID09IElORikgewoJCQkJZGlzdFtueF1bbnldW25wYXJpdHldID0gZGlzdFt4XVt5XVtwYXJpdHldICsgMTsgCgkJCQlxLnB1c2goe254LCBueSwgbnBhcml0eX0pOwoJCQl9CgkJfQoJfQoKCWZvciAoaW50IHggPSAxOyB4IDw9IG47IHgrKykgewoJCWZvciAoaW50IHkgPSAxOyB5IDw9IG47IHkrKykgewoJCQlmb3IgKGludCBwYXJpdHkgPSAwOyBwYXJpdHkgPD0gMTsgcGFyaXR5KyspIHsKCQkJCW1heGltaXplKG14W3hdW3ldW3Bhcml0eV0sIGRpc3RbeF1beV1bcGFyaXR5XSk7CgkJCX0KCQl9Cgl9Cn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAkKCWNpbiA+PiBuOyAKCWZvciAoaW50IHggPSAxOyB4IDw9IG47IHgrKykgewoJCWNpbiA+PiBib2FyZFt4XTsKCQlib2FyZFt4XSA9ICcgJyArIGJvYXJkW3hdOyAKCQlmb3IgKGludCB5ID0gMTsgeSA8PSBuOyB5KyspIHsKCQkJaWYgKGJvYXJkW3hdW3ldID09ICdUJykge2t4ID0geDsga3kgPSB5O30KCQkJaWYgKGJvYXJkW3hdW3ldID09ICdNJykga25pZ2h0cy5wdXNoX2JhY2soe3gsIHl9KTsgIAkgCgkJfQoJfQoKCWJmcyhreCwga3ksIDApOyAgCglmb3IgKGF1dG8gW3N4LCBzeV0gOiBrbmlnaHRzKSBiZnMoc3gsIHN5LCAxKTsgCgoJaW50IGFucyA9IElORjsgIAoJZm9yIChpbnQgeCA9IDE7IHggPD0gbjsgeCsrKSB7CgkJZm9yIChpbnQgeSA9IDE7IHkgPD0gbjsgeSsrKSB7CgkJCWZvciAoaW50IHBhcml0eSA9IDA7IHBhcml0eSA8PSAxOyBwYXJpdHkrKykgewoJCQkJbWluaW1pemUoYW5zLCBteFt4XVt5XVtwYXJpdHldKTsKCQkJfQoJCX0KCX0JCglpZiAoYW5zID09IElORikgYW5zID0gLTE7IAoJY291dCA8PCBhbnMgPDwgJ1xuJzsKfQ==