#include <bits/stdc++.h>
using namespace std;

int W,H;
char str[32][32];
bool is_exist;

void print_map(){
	for(int i = 1; i <= H; i++){
		for(int j = 1; j <= W; j++){
			printf("%c",str[i][j]);
		}
		puts("");
	}
}

bool is_movable(int x,int y){
	return str[x][y] == '.' || str[x][y] == 'X';
}

bool change_dir(int x,int y){
	switch(str[x][y]){
		case 'E' :
			if(is_movable(x+1,y)){
				str[x][y] = 'S';
			}
			else if (is_movable(x,y+1)){
				str[x][y] = 'E';
			}
			else if (is_movable(x-1,y)){
				str[x][y] = 'N';
			}
			else if (is_movable(x,y-1)){
				str[x][y] = 'W';
			}
			is_exist = true;
			break;
		case 'N' :
			if(is_movable(x,y+1)){
				str[x][y] = 'E';
			}
			else if(is_movable(x-1,y)){
				str[x][y] = 'N';
			}
			else if (is_movable(x,y-1)){
				str[x][y] = 'W';
			}
			else if (is_movable(x+1,y)){
				str[x][y] = 'S';
			}
			is_exist = true;
			break;
		case 'W' :
			if(is_movable(x-1,y)){
				str[x][y] = 'N';
			}
			else if(is_movable(x,y-1)){
				str[x][y] = 'W';
			}
			else if (is_movable(x+1,y)){
				str[x][y] = 'S';
			}
			else if (is_movable(x,y+1)){
				str[x][y] = 'E';
			}
			is_exist = true;
			break;
		case 'S' :
			if(is_movable(x,y-1)){
				str[x][y] = 'W';
			}
			else if (is_movable(x+1,y)){
				str[x][y] = 'S';
			}
			else if(is_movable(x,y+1)){
				str[x][y] = 'E';
			}
			else if (is_movable(x-1,y)){
				str[x][y] = 'N';
			}
			is_exist = true;
			break;
		default :
			break;
	}
}

void move(int x,int y){
	if(str[x][y] == '.'){
		if(str[x][y+1] == 'W'){
			str[x][y+1] = '*';
			str[x][y] = 'w';
		}
		else if (str[x-1][y] == 'S'){
			str[x-1][y] = '*';
			str[x][y] = 's';
		}
		else if(str[x][y-1] == 'E'){
			str[x][y-1] = '*';
			str[x][y] = 'e';
		}
		else if(str[x+1][y] == 'N'){
			str[x+1][y] = '*';
			str[x][y] = 'n';
		}
	}
	else if(str[x][y] == 'X'){
		if(str[x][y+1] == 'W'){
			str[x][y+1] = '*';
		}
		else if (str[x-1][y] == 'S'){
			str[x-1][y] = '*';
		}
		else if(str[x][y-1] == 'E'){
			str[x][y-1] = '*';
		}
		else if(str[x+1][y] == 'N'){
			str[x+1][y] = '*';
		}
	}
}


void update(){
	for(int i = 1; i <= H; i++){
		for(int j = 1; j <= W; j++){
			if(str[i][j] == '*'){
				str[i][j] = '.';
			}
			else if(str[i][j] == 'w'){
				str[i][j] = 'W';
			}
			else if(str[i][j] == 'n'){
				str[i][j] = 'N';
			}
			else if (str[i][j] == 'e'){
				str[i][j] = 'E';
			}
			else if(str[i][j] == 's'){
				str[i][j] = 'S';
			}
		}
	}
}

int main(){
	while(scanf("%d%d",&W,&H),W != 0 && H != 0){
		bool flg = true;
		for(int i = 0; i < 32; i++){
			memset(str[i],0,32);
		}
		for(int i = 1; i <= H; i++){
			scanf("%s",str[i]+1);
		}
		for(int t = 0; t <= 180; t++){
			//1
			is_exist = false;
			for(int i = 1; i <= H; i++){
				for(int j = 1; j <= W; j++){
					change_dir(i,j);
				}
			}
			if(!is_exist){
				printf("%d\n",t);
				flg = false;
				break;
			}
			//2
			for(int i = 1; i <= H; i++){
				for(int j = 1; j <= W; j++){
					move(i,j);
				}
			}
			update();
			//print_map();
		}
		if(flg){
			printf("NA\n");
		}
	}
	return 0;
}

