0是立着,1是横着躺,2是竖着躺
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=510;
char g[N][N];
int dis[N][N][3];
int dist[N][N][3];
struct State{
int x,y,lie;
}st,ed,nxt;
const int d[3][4][3] = { //3种状态012,每种状态4个方向,每次变换要变3个值
{{-2, 0, 2}, {0, 1, 1}, {1, 0, 2}, {0, -2, 1}},
{{-1, 0, 1}, {0, 2, 0}, {1, 0, 1}, {0, -1, 0}},
{{-1, 0, 0}, {0, 1, 2}, {2, 0, 0}, {0, -1, 2}}
};
bool check(int x,int y){
if(x<0||x>=n||y<0||y>=m) return false;
if(g[x][y]=='#') return false;
return true;
}
int bfs(){
memset(dis,-1,sizeof dis);
dis[st.x][st.y][st.lie]=0;
queue<State> q;
q.push(st);
while(!q.empty()){
State t=q.front();
q.pop();
for(int i=0;i<4;i++){
nxt={t.x+d[t.lie][i][0],t.y+d[t.lie][i][1],d[t.lie][i][2]};
int x=nxt.x,y=nxt.y;
if(!check(x,y)) continue;
if(nxt.lie==0&&g[x][y]=='E') continue;
if(nxt.lie==1&&!check(x,y+1)) continue;
if(nxt.lie==2&&!check(x+1,y)) continue;
if(dis[nxt.x][nxt.y][nxt.lie]==-1){
dis[nxt.x][nxt.y][nxt.lie]=dis[t.x][t.y][t.lie]+1;
q.push(nxt);
}
}
}
return dis[ed.x][ed.y][ed.lie];
}
int main(){
while(cin>>n>>m,n||m){
for(int i=0;i<n;i++) cin>>g[i];
st={-1};
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){ //bug
if(g[i][j]=='X'&&st.x==-1){
if(g[i+1][j]=='X') st={i,j,2};
else if(g[i][j+1]=='X') st={i,j,1};
else st={i,j,0};
}else if(g[i][j]=='O') ed={i,j,0};
}
}
int res=bfs();
if(res==-1) cout<<"Impossible"<<endl;
else cout<<res<<endl;
}
}