#include<iostream> //bfs
#include<queue>
using namespace std;
struct node
{
int si,sj,ti,tj,step; //(si,sj),(ti,tj)分别是Paris,Helen的位置,step是步数
}fro,rear;
queue<node> col;
int n,m,vis[20][20][20][20];
char ch[20][20],way[8]={'N','S','W','E'};
int dis[8][2]={{-1,0},{1,0},{0,-1},{0,1}};
int main()
{
cin>>n>>m;
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
{
cin>>ch[i][j];
if(ch[i][j]=='P')
fro.si=i,fro.sj=j;
else if(ch[i][j]=='H')
fro.ti=i,fro.tj=j;
}
fro.step=0;
col.push(fro);
vis[fro.si][fro.sj][fro.ti][fro.tj]=1;
cin>>way+4;
for(int i=4;i<8;++i)
for(int j=0;j<4;++j)
if(way[i]==way[j])
dis[i][0]=dis[j][0],dis[i][1]=dis[j][1];
//使得dis[i+4]与dis[i]相对应,即若Paris的转向是(dis[i][0],dis[i][1]),则Helen的转向是(dis[i+4][0],dis[i+4][1])
int tag=1,mov1,mov2,mov3,mov4;
while(tag&&!col.empty()&&col.front().step<255)
{
fro=col.front();
col.pop();
for(int i=0;i<4;++i)
{
mov1=fro.si+dis[i][0];
mov2=fro.sj+dis[i][1];
mov3=fro.ti+dis[i+4][0];
mov4=fro.tj+dis[i+4][1];
if(ch[mov1][mov2]=='#'||ch[mov1][mov2]=='!'||ch[mov3][mov4]=='!') //因为"四周均是均是岩石或熔浆",故不必讨论越界的情况
continue;
if(ch[mov3][mov4]=='#') //"如果Helen碰到岩石上,那么她将停留在原地"
mov3=fro.ti,mov4=fro.tj;
if(vis[mov1][mov2][mov3][mov4]==1)
continue;
vis[mov1][mov2][mov3][mov4]=1;
rear.step=fro.step+1;
rear.si=mov1;rear.sj=mov2;
rear.ti=mov3;rear.tj=mov4;
//注意相遇是指Paris与Helen最终到达同一个格子,或者二人在相邻两格移动后碰在了一起
if( (rear.si==rear.ti&&rear.sj==rear.tj) || (fro.si==rear.ti&&fro.sj==rear.tj&&fro.ti==rear.si&&fro.tj==rear.sj) )
{
cout<<rear.step<<endl;
tag=0;
break;
}
col.push(rear);
}
}
if(tag)
cout<<"Impossible\n";
return 0;
}