咕咕咕。
//树的重心
void dfs(int x) {
v[x]=1; size[x]=1;
int max_part=0;
for(int i=hed[x];i;i=nxt[i])
{
int y=ver[i];
if(v[y]) continue;
dfs(y); size[x]+=size[y];
max_part=max(max_part,size[y]);
}
max_part=max(max_part,n-size[x]);
if(max_part<ans) {
ans=max_part;
ans_node=x;
}
}
//推箱子,没AC
#include<bits/stdc++.h>
using namespace std;
const int maxn=31;
char s[maxn][maxn];
int n,m;
struct node{
int x,y,dir;
}st[7],ed[7];
int stcnt,edcnt;
struct node2{
int x,y;
}manst;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int ddir[4]={1,0,3,2};
node pre_box[maxn][maxn][4];
int min_box[maxn][maxn][4],min_man[maxn][maxn][4];
bool valid(int x,int y)
{
if(x<1||x>n||y<1||y>m) return false;
return s[x][y]=='#' ? false : true;
}
bool connect(int r,int c)//man to r,c
{
int vis[maxn][maxn]={0}; vis[manst.x][manst.y]=1;
queue<node2>q;
q.push(manst);
while(!q.empty())
{
node2 u=q.front();q.pop();
if(u.x==r&&u.y==c) return true;
for(int i=0;i<4;++i)
{
node2 v=(node2){u.x+dx[i],u.y+dy[i]};
if(!valid(v.x,v.y)||vis[v.x][v.y]) continue;
q.push(v); vis[v.x][v.y]=1;
}
}
return false;
}
void findsted()
{
stcnt=edcnt=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
if(s[i][j]=='S') {
s[i][j]='.';
manst.x=i,manst.y=j;
}
if(s[i][j]=='T') {
s[i][j]='.';
for(int D=0;D<4;++D) {
if(valid(i+dx[D],j+dy[D])) {
ed[++edcnt]=(node){i,j,D};
}
}
}
}
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
if(s[i][j]=='B') {
s[i][j]='.';
for(int D=0;D<4;++D) {
if(valid(i+dx[D],j+dy[D])) {
s[i][j]='#';
if(connect(i+dx[D],j+dy[D]))
st[++stcnt]=(node){i,j,D};
s[i][j]='.';
}
}
}
}
}
int getstep(node U,node V)
{
node2 S=(node2){U.x+dx[U.dir],U.y+dy[U.dir]};
node2 T=(node2){U.x+dx[V.dir],U.y+dy[V.dir]};
int step[maxn][maxn]; memset(step,-1,sizeof step);
queue<node2>q;
q.push(S); step[S.x][S.y]=0;
while(!q.empty())
{
node2 u=q.front();q.pop();
if(u.x==T.x&&u.y==T.y) return step[u.x][u.y];
for(int i=0;i<4;++i)
{
node2 v=(node2){u.x+dx[i],u.y+dy[i]};
if(!valid(v.x,v.y)||step[v.x][v.y]!=-1) continue;
q.push(v); step[v.x][v.y]=step[u.x][u.y]+1;
}
}
return -1;
}
int getstep(node2 U,node V)
{
node2 T=(node2){V.x+dx[V.dir],V.y+dy[V.dir]};
int step[maxn][maxn]; memset(step,-1,sizeof step);
queue<node2>q;
q.push(U); step[U.x][U.y]=0;
while(!q.empty())
{
node2 u=q.front();q.pop();
if(u.x==T.x&&u.y==T.y) return step[u.x][u.y];
for(int i=0;i<4;++i)
{
node2 v=(node2){u.x+dx[i],u.y+dy[i]};
if(!valid(v.x,v.y)||step[v.x][v.y]!=-1) continue;
q.push(v); step[v.x][v.y]=step[u.x][u.y]+1;
}
}
return -1;
}
bool is_ans(node u)
{
for(int i=1;i<=edcnt;++i)
if(ed[i].x==u.x&&ed[i].y==u.y&&ed[i].dir==u.dir) return true;
return false;
}
int solve()
{
int jd=-1;
memset(min_box,63,sizeof min_box);
memset(min_man,63,sizeof min_man);
queue<node>q;
for(int i=1;i<=stcnt;++i)
{
q.push(st[i]);
min_box[st[i].x][st[i].y][st[i].dir]=0;
s[st[i].x][st[i].y]='#';
min_man[st[i].x][st[i].y][st[i].dir]=getstep(manst,st[i]);
s[st[i].x][st[i].y]='.';
pre_box[st[i].x][st[i].y][st[i].dir].x=0;
}
while(!q.empty())
{
node u=q.front();q.pop();
// printf("u(%d,%d)\n",u.x,u.y);
if(is_ans(u)) jd=1;
for(int i=0;i<4;++i)
{
node v=(node){u.x+dx[i],u.y+dy[i],ddir[i]};
if(!valid(v.x,v.y) || !valid(u.x+dx[v.dir],u.y+dy[v.dir])) continue;
if(min_box[u.x][u.y][u.dir]+1>min_box[v.x][v.y][v.dir]) continue;
s[u.x][u.y]='#';
int step=getstep(u,v);
s[u.x][u.y]='.';
if(step==-1) continue;
if(min_box[u.x][u.y][u.dir]+1==min_box[v.x][v.y][v.dir]&&
min_man[u.x][u.y][u.dir]+step>min_man[v.x][v.y][v.dir]) continue;
min_box[v.x][v.y][v.dir]=min_box[u.x][u.y][u.dir]+1;
min_man[v.x][v.y][v.dir]=min_man[u.x][u.y][u.dir]+step;
pre_box[v.x][v.y][v.dir]=u;
q.push(v);
}
}
return jd;
}
void putlina(int ind)
{
switch(ind)
{
case 0:cout<<'s';break;
case 1:cout<<'n';break;
case 2:cout<<'e';break;
case 3:cout<<'w';break;
}
}
void putlinA(int ind)
{
switch(ind)
{
case 0:cout<<'S';break;
case 1:cout<<'N';break;
case 2:cout<<'E';break;
case 3:cout<<'W';break;
}
}
void road(int sx,int sy,int ex,int ey)
{
int pre[maxn][maxn]; memset(pre,-1,sizeof pre);
pre[sx][sy]=-2; queue<node2>q; q.push((node2){sx,sy});
while(!q.empty())
{
node2 u=q.front(); q.pop();
if(u.x==ex&&u.y==ey)
{
stack<int>sta;
while(pre[u.x][u.y]!=-2) {
sta.push(pre[u.x][u.y]);
int d=pre[u.x][u.y];//
u.x+=dx[d], u.y+=dy[d];
}
while(!sta.empty())
{
putlina(sta.top());
sta.pop();
}
return;
}
for(int i=0;i<4;++i) {
node2 v=(node2){u.x+dx[i],u.y+dy[i]};
if(!valid(v.x,v.y)) continue;
if(pre[v.x][v.y]!=-1) continue;
q.push(v); pre[v.x][v.y]=ddir[i];
}
}
}
void out()
{
stack<node>sta;
int boxx=1010010101,mann=1010010101,i;
for(int j=1;j<=edcnt;++j)
if(min_box[ed[j].x][ed[j].y][ed[j].dir]<boxx ||
min_box[ed[j].x][ed[j].y][ed[j].dir]==boxx&&min_man[ed[j].x][ed[j].y][ed[j].dir]<mann)
{
boxx=min_box[ed[j].x][ed[j].y][ed[j].dir];
mann=min_man[ed[j].x][ed[j].y][ed[j].dir];
i=j;
}
node u=ed[i];
while(u.x) sta.push(u), u=pre_box[u.x][u.y][u.dir];
vector<node>vec;
while(!sta.empty()) {
vec.push_back(sta.top());
sta.pop();
}
s[st[1].x][st[1].y]='#';
road(manst.x,manst.y,vec[0].x+dx[vec[1].dir],vec[0].y+dy[vec[1].dir]);
s[st[1].x][st[1].y]='.';
putlinA(vec[1].dir);
for(int k=2;k<(int)vec.size();++k) {
s[vec[k-1].x][vec[k-1].y]='#';
road(vec[k-1].x+dx[vec[k-1].dir],vec[k-1].y+dy[vec[k-1].dir],vec[k-1].x+dx[vec[k].dir],vec[k-1].y+dy[vec[k].dir]);
s[vec[k-1].x][vec[k-1].y]='.';
putlinA(vec[k].dir);
}
return;
}
int main()
{
int T=0;
while(scanf("%d%d",&n,&m)==2 && n)
{
memset(s,0,sizeof s);
for(int i=1;i<=n;++i) scanf("%s",s[i]+1);
findsted();
printf("Maze #%d\n",++T);
if(solve()==-1) printf("Impossible.\n\n");
else
out(),printf("\n\n");
}
}