#include <bits/stdc++.h>
using namespace std;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
int n, m, minans = INT_MAX;
char mp[205][205];
int vis1[205][205], vis2[205][205]; // 表示是否走过这个点。到这个点的步数
struct node
{
int x, y, step;
};
int A, B, C, D;
void bfs(int x, int y, int vis[205][205]);
int main()
{
// 输入
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> mp[i][j];
// 记录我的朋友的起点
if (mp[i][j] == '@')
{
A = i;
B = j;
}
if (mp[i][j] == '&')
{
C = i;
D = j;
}
}
}
bfs(A, B, vis1); // 搜索我,将我的起点和记录我步数的数组作为参数传入函数
bfs(C, D, vis2); // 搜索我朋友
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (mp[i][j] == 'F' && vis1[i][j] && vis2[i][j]) // 是KFC且都能到
minans = min(minans, vis1[i][j] + vis2[i][j]);
if (minans == INT_MAX) // 不能相约 minans未改变
cout << "Meeting cancelled";
else
cout << minans;
}
void bfs(int x, int y, int vis[205][205])
{
queue<node> que;
vis[x][y] = 1; // 标记起点
que.push({x, y, 0});
while (que.size()) // 队列非空 一直搜索
{
node hd = que.front();
que.pop();
for (int i = 0; i < 4; i++) // 遍历4个方向
{
int r = hd.x + dx[i];
int c = hd.y + dy[i];
int step = hd.step + 1; // 计算新点新步数
if (r < 1 || c < 1 || r > n || c > m || mp[r][c] == '#' || vis[r][c]) // 新点不能走
continue;
vis[r][c] = step; // 标记新点
que.push({r, c, step}); // 新点新步数入队
}
}
}