#include<iostream>
using namespace std;
#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
#define E 0
#define N 1
#define W 2
#define S 3

int dx[]={1,0,-1,0};
int dy[]={0,-1,0,1};
int opp[]={W,S,E,N};
char m[30][30];

bool move(int r,int c,int y,int x){
  rep(i,4){
    int nex=x+dx[i],ney=y+dy[i];
    if ( nex<0||ney<0||ney>=r||nex>=c)continue;
    if ( m[ney][nex] == opp[i]){
      m[ney][nex]='.';
      if ( m[y][x] == 'X')return true;
      else {m[y][x]=opp[i]+10;return false;}
    }
  }
  return false;
}

void nextD(int r,int c,int y,int x,int d){
  rep(i,4){
    int now = (d+4+i-1)%4;
    int nex=x+dx[now],ney=y+dy[now];
    if ( nex<0||ney<0||nex>=c||ney>=r)continue;
    if ( m[ney][nex]=='.'||m[ney][nex]=='X'){
      m[y][x]=now;
      return;
    }
  }
}


int solve(int r,int c,int person){
  int time=0;
  while(person){
    time++;
    if ( time >180)return -1;
    rep(i,r)
      rep(j,c)
      if ( m[i][j]==E||m[i][j]==S||
	   m[i][j]==W||m[i][j]==N)nextD(r,c,i,j,m[i][j]);

    rep(i,r){
      rep(j,c){
	if ( (m[i][j]=='.'||m[i][j]=='X') && move(r,c,i,j)==true ){
	  person--;
	}
      }
    }

    rep(i,r)
      rep(j,c)if ( m[i][j]>=10 && m[i][j] <=13)m[i][j]-=10;

  }
  if ( person != 0)return -1;
  return time;
}


main(){
  int c,r;
  while(cin>>c>>r && c){
    int cnt = 0;
    rep(i,r){
      cin>>m[i];
      rep(j,c){
	if ( m[i][j]=='E')m[i][j]=E,cnt++;
	else if ( m[i][j] == 'S')m[i][j]=S,cnt++;
	else if ( m[i][j] == 'W')m[i][j]=W,cnt++;
	else if ( m[i][j] == 'N')m[i][j]=N,cnt++;
      }
    }
    int ans = solve(r,c,cnt);
    if ( ans == -1)cout << "NA"<<endl;
    else cout << ans << endl;
  }
  return false;
}