#include<iostream>
#include<algorithm>
using namespace std;
struct State{char x[35][35];};
int H,W,dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};State S;char f[5]="NESW";
int solve(State V,int depth){
	if(depth==31)return 99999999;
	bool OK=true;
	for(int i=0;i<H;i++){
		for(int j=0;j<W;j++){
			if(V.x[i][j]>='A' && V.x[i][j]<='W')OK=false;
		}
	}
	if(OK==true)return depth;
	vector<int>G[30][30];
	for(int i=0;i<H;i++){
		for(int j=0;j<W;j++){
			if(V.x[i][j]<'A' || V.x[i][j]>'W')continue;
			
			int dr=0;for(int k=0;k<4;k++){if(V.x[i][j]==f[k])dr=k;}
			for(int k=dr+5;k>=dr-2;k--){
				int ex=i+dx[k%4],ey=j+dy[k%4];
				if(V.x[ex][ey]=='X' || V.x[ex][ey]=='.'){
					V.x[i][j]=f[k%4];
					G[ex][ey].push_back((11-k)%4);break;
				}
			}
		}
	}
	State I=V;
	for(int i=0;i<H;i++){
		for(int j=0;j<W;j++){
			if(G[i][j].size()>=1){
				sort(G[i][j].begin(),G[i][j].end());
				int J=(11-G[i][j][0])%4;
				int fx=i-dx[J],fy=j-dy[J];
				if(I.x[i][j]!='X'){I.x[i][j]=I.x[fx][fy];}
				I.x[fx][fy]='.';
			}
		}
	}
	return solve(I,depth+1);
}
int main(){
	while(true){
		cin>>W>>H;if(W==0 && H==0)break;
		for(int i=0;i<H;i++){for(int j=0;j<W;j++)cin>>S.x[i][j];}
		int ans=solve(S,0);
		if(ans>180)cout<<"NA"<<endl;else cout<<ans<<endl;
	}
	return 0;
}