#include <bits/stdc++.h>
#define mem(a,b) memset((a),(b),sizeof(a))
#define MP make_pair
#define pb push_back
#define row first
#define arrange second
#define sz(x) (int)x.size()
#define all(x) x.begin(),x.end()
#define sqr(x) (x)*(x)
#define REP(i,j) for(int i=0;i<j;i++)
#define REP1(i,j) for(int i=1;i<=j;i++)
#define REP2(i,j) for(int i=j;i>=1;i--)
#pragma GCC optimize("O3")
using namespace std;
using namespace __gnu_cxx;
typedef int I;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<I,I> PIi;
typedef pair<ll,ll> PLL;
typedef pair<I,ll> PIL;
typedef pair<ll,I> PLI;
typedef vector<I> VI;
typedef vector<ll> VL;
typedef vector<PIi> VPII;
typedef vector<string> VS;
typedef greater<I> GI;
typedef priority_queue<I> PQI;
typedef priority_queue<I,VI,GI> PQV;
/************* define end *************/
void println(VI x){for(I i=0;i<sz(x);i++) printf("%d%c",x[i]," \n"[i==sz(x)-1]);}
void println(VL x){for(I i=0;i<sz(x);i++) printf("%lld%c",x[i]," \n"[i==sz(x)-1]);}
void println(I *x,I l,I r){for(I i=l;i<=r;i++) printf("%d%c",x[i]," \n"[i==r]);}
void println(ll *x,I l,I r){for(I i=l;i<=r;i++) printf("%lld%c",x[i]," \n"[i==r]);}
void pri(ll x,ll y){printf("%lld %lld\n",x,y);}
void pri(I x,I y){printf("%d %d",x,y);}
void pri(ll x){printf("%lld\n",x);}
void pri(int x){printf("%d\n",x);}
/*************** IO end ***************/
void go();//主函数
int main(){
//#ifdef tokitsukaze
//freopen("TEST.txt","r",stdin);
//#endif
go();return 0;
}
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int INF=0x3f3f3f3f;
const ll LLINF=0x3f3f3f3f3f3f3f3fLL;
const double PI=acos(-1.0);
const double eps=1e-6;
const int MAX=1e5;
const ll mod=998244353;
/********************************* head *********************************/
struct PII{
int row,arrange,step;
};
int map_row=read(),map_arrange=read(),all_shortest=INF;
PII my_point,friend_point;
char __map[201][201];
int way_row[4]={1,-1,0,0};
int way_arrange[4]={0,0,1,-1};
int bfs(int KFC_point_row,int KFC_point_arrange,int is_me_or_friend){
int start_row,start_arrange;
if(is_me_or_friend)start_row=my_point.row,start_arrange=my_point.arrange;
else start_row=friend_point.row,start_arrange=friend_point.arrange;
queue<PII> now_point;
now_point.push({start_row,start_arrange,0});
while(!now_point.empty()){
PII now=now_point.front();
now_point.pop();
if(now.row==KFC_point_row && now.arrange==KFC_point_arrange)return now.step;
for(int way=0;way<4;way++){
if(now.row+way_row[way]<=map_row && now.row+way_row[way]>=1 && now.arrange+way_arrange[way]<=map_arrange && now.arrange+way_arrange[way]>=1 && __map[now.row+way_row[way]][now.arrange+way_arrange[way]]!='#'){
now_point.push({now.row+way_row[way],now.arrange+way_arrange[way],now.step+1});
}
}
}
return INF;
}
void go(){
REP1(i,map_row){
REP1(j,map_arrange){
cin>>__map[i][j];
if(__map[i][j]=='@')my_point.row=i,my_point.arrange=j;
if(__map[i][j]=='&')friend_point.row=i,friend_point.arrange=j;
}
}
int my_shortest,friend_shortest;
REP1(i,map_row){
REP1(j,map_arrange){
if(__map[i][j]=='F')my_shortest=bfs(i,j,1),friend_shortest=bfs(i,j,0);
all_shortest=min(all_shortest,my_shortest+friend_shortest);
}
}
if(all_shortest==INF)printf("Meeting cancelled");
else pri(all_shortest);
return ;
}
(空间限制128M)