#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <algorithm>
#include <numeric>
#include <functional>
#include <cmath>
#include <cstring>
#include <cctype>
#include <sstream>
#include <set>
#include <map>
#include <queue>
#include <complex>
using namespace std;
#define REP(i,n) for(int i = 0; i < (int)n; i++)
#define FOR(i,a,b) for(int i = a; i < (int)b; i++)
const int INF = 1<<28;
const int MAX_H = 35;
const int MAX_W = 35;

struct P {
  int h, w, d;
  P(int a, int b, int c) {h = a; w = b; d = c;}
  bool operator > (const P& a) const {
    return d > a.d; 
  }
};

int my[] = {0, 1, 0, -1};
int mx[] = {-1, 0, 1, 0};
int W, H;
int field[MAX_H][MAX_W];


int dicideDirection(int &w, int &h, int &d){
  REP(i, 4) {
    if((d+i+3)%4 == 0 && w - 1 >= 0 && field[h][w-1] > 99) return 0;
    else if((d+i+3)%4 == 1 && h + 1 < H && field[h+1][w] > 99) return 1;
    else if((d+i+3)%4 == 2 && w + 1 < W && field[h][w+1] > 99) return 2;
    else if((d+i+3)%4 == 3 && h - 1 >= 0 && field[h-1][w] > 99) return 3;
  }
  return d;
}

int main() {
  while(cin >> W >> H, W|H) {
    REP(i, H) REP(j, W) {
      char in; cin >> in;
      if(in == '#') field[i][j] = 10;
      else if(in == '.') field[i][j] = 100;
      else if(in == 'X') field[i][j] = 1000;
      else if(in == 'E') field[i][j] = 2;
      else if(in == 'N') field[i][j] = 3;
      else if(in == 'W') field[i][j] = 0;
      else if(in == 'S') field[i][j] = 1;
    }

    queue<P> q;
    priority_queue<P, vector<P>, greater<P> > pq;
    REP(i, H) REP(j, W)
      if(field[i][j] < 4)
        q.push(P(i, j, field[i][j]));

    int cnt = 0;
    while(q.size() | pq.size()) {

      //dicide direction
      while(q.size()) {
        P pp = q.front(); q.pop();
        int next_d = dicideDirection(pp.w, pp.h, pp.d);
        pp.d = next_d;
        pq.push(pp);
        field[pp.h][pp.w] = next_d;
      }

      //dicide move
      while(pq.size()) {
        P pp = pq.top(); pq.pop();
        if(pp.d == 0 && field[pp.h][pp.w-1] > 99) {
          if(field[pp.h][pp.w-1] == 1000)
            field[pp.h][pp.w] = 100;
          else {
            swap(field[pp.h][pp.w], field[pp.h][pp.w-1]);
            q.push(P(pp.h, pp.w-1, pp.d));
          }
        }
        else if(pp.d == 1 && field[pp.h+1][pp.w] > 99) {
          if(field[pp.h+1][pp.w] == 1000)
            field[pp.h][pp.w] = 100;
          else {
            swap(field[pp.h][pp.w], field[pp.h+1][pp.w]);
            q.push(P(pp.h+1, pp.w, pp.d));
          }
        }
        else if(pp.d == 2 && field[pp.h][pp.w+1] > 99) {
          if(field[pp.h][pp.w+1] == 1000)
            field[pp.h][pp.w] = 100;
          else {
            swap(field[pp.h][pp.w], field[pp.h][pp.w+1]);
            q.push(P(pp.h, pp.w+1, pp.d));
          }
        }
        else if(pp.d == 3 && field[pp.h-1][pp.w] > 99) {
          if(field[pp.h-1][pp.w] == 1000)
            field[pp.h][pp.w] = 100;
          else {
            swap(field[pp.h][pp.w], field[pp.h-1][pp.w]);
            q.push(P(pp.h-1, pp.w, pp.d));
          }
        }
        else
          q.push(pp);
      }
      cnt++;
      if(cnt > 180) break;
    }
    if(cnt > 180) cout << "NA" << endl;
    else cout << cnt << endl;
  }
  return 0;
}