#include<iostream>
#include<string>

char maze[31][31], tempMaze[31][31];
int H, W;

using namespace std;

void changeDirection(){
  int i, j;

  for(i=0; i<H; i++){
    for(j=0; j<W; j++){
      if(maze[i][j]=='E'){
        if(maze[i+1][j]=='.' || maze[i+1][j]=='X')maze[i][j]='S';
        else if(maze[i][j+1]=='.' || maze[i][j+1]=='X')maze[i][j]='E';
        else if(maze[i-1][j]=='.' || maze[i-1][j]=='X')maze[i][j]='N';
        else if(maze[i][j-1]=='.' || maze[i][j-1]=='X')maze[i][j]='W';
      }
      else if(maze[i][j]=='N'){
        if(maze[i][j+1]=='.' || maze[i][j+1]=='X')maze[i][j]='E';
        else if(maze[i-1][j]=='.' || maze[i-1][j]=='X')maze[i][j]='N';
        else if(maze[i][j-1]=='.' || maze[i][j-1]=='X')maze[i][j]='W';
        else if(maze[i+1][j]=='.' || maze[i+1][j]=='X')maze[i][j]='S';
      }
      else if(maze[i][j]=='W'){
        if(maze[i-1][j]=='.' || maze[i-1][j]=='X')maze[i][j]='N';
        else if(maze[i][j-1]=='.' || maze[i][j-1]=='X')maze[i][j]='W';
        else if(maze[i+1][j]=='.' || maze[i+1][j]=='X')maze[i][j]='S';
        else if(maze[i][j+1]=='.' || maze[i][j+1]=='X')maze[i][j]='E';
      }
      else if(maze[i][j]=='S'){
        if(maze[i][j-1]=='.' || maze[i][j-1]=='X')maze[i][j]='W';
        else if(maze[i+1][j]=='.' || maze[i+1][j]=='X')maze[i][j]='S';
        else if(maze[i][j+1]=='.' || maze[i][j+1]=='X')maze[i][j]='E';
        else if(maze[i-1][j]=='.' || maze[i-1][j]=='X')maze[i][j]='N';
      }
    }
  }
}

void goStraight(){
  int i, j, flag;
  for(i=0; i<H; i++){
    for(j=0; j<W; j++){
      tempMaze[i][j] = maze[i][j];
    }
  }
  for(i=0; i<H; i++){
    for(j=0; j<W; j++){
      flag = 0;
      if(tempMaze[i][j]=='X'){
        if(tempMaze[i][j+1]=='W'){
          maze[i][j+1]='.';
          flag+=1;
	}
        else if(tempMaze[i-1][j]=='S' && flag==0){
          maze[i-1][j]='.';
          flag+=1;
        }
        else if(tempMaze[i][j-1]=='E' && flag==0){
          maze[i][j-1]='.';
          flag+=1;
        }
        else if(tempMaze[i+1][j]=='N' && flag==0){
          maze[i+1][j]='.';
        }
      }
      flag = 0;
      if(tempMaze[i][j]=='.'){
	if(tempMaze[i][j+1]=='W'){
          maze[i][j+1]='.';
          maze[i][j] = 'W';
          flag+=1;
        }
        else if(tempMaze[i-1][j]=='S' && flag==0){
          maze[i-1][j]='.';
          maze[i][j] = 'S';
          flag+=1;
        }
        else if(tempMaze[i][j-1]=='E' && flag==0){
          maze[i][j-1]='.';
          maze[i][j] = 'E';
          flag+=1;
        }
        else if(tempMaze[i+1][j]=='N' && flag==0){
          maze[i+1][j]='.';
          maze[i][j] = 'N';
        }
      }
    }
  }
}

int judge(){
  int i, j, flag=0;
  for(i=0; i<H; i++){
    for(j=0; j<W; j++){
      if(maze[i][j]=='E' || maze[i][j]=='N' || maze[i][j]=='W' || maze[i][j]=='S'){
        flag+=1;
      }
    }
  }
  if(flag==0)return 0;
  else return 1;
}

int main(){
  int i, j, time;
  while(cin >> W >> H, H+W){
    for(i=0; i<H; i++){
      for(j=0; j<W; j++){
        cin >> maze[i][j];
      }
    }
    time = 0;
    while(judge()){
      changeDirection();
      goStraight();
      time+=1;
      if(time>180) break;
    }
    if(time<=180)cout << time << endl;
    else cout << "NA" << endl;
  }
}

Measured memory_bytes: 3112