#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<map>
#include<set>
#include<queue>
#include<cstdio>
#include<climits>
#include<cmath>
#include<cstring>
#include<string>
#include<sstream>

#define f first
#define s second
#define mp make_pair

#define REP(i,n) for(int i=0; i<(int)(n); i++)
#define FOR(i,c) for(__typeof((c).begin()) i=(c).begin(); i!=(c).end(); i++)
#define ALL(c) (c).begin(), (c).end()

using namespace std;

typedef unsigned int uint;
typedef long long ll;

char buff[2][40][40];
int w,h;

int d2i[300];
const char i2d[4] = {'E', 'N', 'W', 'S'};
const int dx[4]   = {1,0,-1,0};
const int dy[4]   = {0,-1,0,1};

#define OK(x,y) (x>=0 && x<w && y>=0 && y<h && (board[y][x] == '.' || board[y][x] == 'X'))

int main(){
  REP(i,300) d2i[i] = -1;
  REP(i,4) d2i[i2d[i]] = i;

  while(scanf("%d%d ",&w,&h),w+h){
    char (*board)[40] = buff[0];
    char (*next)[40]  = buff[1];
    REP(i,h) fgets(board[i],sizeof(board[i]),stdin);
    int t = 0;
    while(++t <= 180){
      int cnt[40][40] = {{0}};
      int rest = 0;

      //ü«ðÏ¦é
      REP(i,h) REP(j,w){
        if(d2i[board[i][j]] != -1){
          int direct = (d2i[board[i][j]] + 3) % 4;
          rest++;
          REP(k,4){
            int x = j + dx[direct];
            int y = i + dy[direct];
            if(OK(x,y)){
              cnt[y][x]++;
              board[i][j] = i2d[direct];
              break;
            }
            direct = (direct + 1) % 4;
          }
        }
      }

      //fobO
      /*
      printf("rest = %d\n",rest);
      REP(i,h){ REP(j,w) printf("%d",cnt[i][j]); puts(""); }
      */

      //{[hÌRs[
      REP(i,h) REP(j,w)
        next[i][j] = (d2i[board[i][j]] == -1 ? board[i][j] : '.');

      bool flag[40][40] = {{false}};
      //ÀÛÉÚ®
      REP(i,h) REP(j,w){
        if(cnt[i][j] > 0){
          REP(k,4){
            int x = j + dx[k];
            int y = i + dy[k];
            if(x < 0 || y < 0) continue;
            if(x >=w || y >=h) continue;
            if(d2i[board[y][x]] != -1 && k == (d2i[board[y][x]] + 2) % 4){
              flag[y][x] = true;
              if(next[i][j] == 'X'){
                rest--;
              }else{
                next[i][j] = board[y][x];
              }
              break;
            }
          }
        }
      }

      //Ú®µÈ©Á½lÌ
      REP(i,h) REP(j,w){
        if(!flag[i][j] && d2i[board[i][j]] != -1){
          next[i][j] = board[i][j];
        }
      }

      //fobO
      //REP(i,h){ REP(j,w) printf("%c",next[i][j]); puts(""); }

      if(rest == 0) break;

      //ÌæÌüêÖ¦
      swap(board, next);
    }
    if(t <= 180) printf("%d\n",t);
    else puts("NA");
  }
  return 0;
}