#include<iostream>
#include<vector>

struct P{
	int x, y;
};

struct Person{
	P pos;
	int angle;
};

int toAngleIndex(char angle_c){
	if(angle_c == 'E'){
		return 0;
	}else if(angle_c == 'N'){
		return 1;
	}else if(angle_c == 'W'){
		return 2;
	}else{
		return 3;
	}
	return -1;//該当なし
}


const int MAX_WIDTH = 30, MAX_HEIGHT = 30;
const P dp[] = {{1, 0}, {0, -1}, {-1, 0}, {0, 1}};

int main(){
	int W, H;
	while(std::cin >> W >> H, W){

		char map[MAX_WIDTH][MAX_HEIGHT];
		std::vector<Person> people;

		for(int i=0;i<H;i++){
			for(int j=0;j<W;j++){
				char c;
				std::cin >> c;
				if('E' <= c && c <= 'W'){
					people.push_back({{j, i}, toAngleIndex(c)});
					map[j][i] = '.';
				}else{
					map[j][i] = c;
				}
			}
		}

		int t = 0;
		while(!people.empty() && t++ <= 180){
			// Step 1: 向きを変える
			int grassMap[MAX_WIDTH][MAX_HEIGHT];
			for(int i=0;i<H;i++){
				for(int j=0;j<W;j++){
					grassMap[j][i] = 0;
				}
			}
			for(auto person : people){
				grassMap[person.pos.x][person.pos.y]++;
			}

			std::vector<Person> _p1;
			for(auto person : people){
				int prev_angle = person.angle;
				P prev_pos = person.pos;

				bool canMove = false;
				for(int i=0;i<4;i++){
					int angle = (prev_angle + i + 3) % 4;
					P pos = {person.pos.x + dp[angle].x,
									 person.pos.y + dp[angle].y};
					if(0 <= pos.x && pos.x < W && 
						 0 <= pos.y && pos.y < H &&
						 map[pos.x][pos.y] != '#' &&
						 grassMap[pos.x][pos.y] == 0){
						_p1.push_back({prev_pos, angle});//向きだけ変える
						canMove = true;
						break;
					}
				}
		
				if(!canMove){
					_p1.push_back({prev_pos, prev_angle});
				}
			}
			people = _p1;

			// Step 2 移動させる
			// 誰が移動の権利を得るのか
			int winnerMap[MAX_WIDTH][MAX_HEIGHT];
			for(int i=0;i<H;i++){
				for(int j=0;j<W;j++){
					winnerMap[j][i] = -1;
				}
			}
	
			std::vector<Person> _p2, _p3;
			for(int i=0;i<people.size();i++){
				Person person = people[i];
				int angle = person.angle;
				P prev_pos = person.pos,
					pos = {prev_pos.x + dp[angle].x,
								 prev_pos.y + dp[angle].y};
				if(winnerMap[pos.x][pos.y] == -1){//暫定チャンピオン
					winnerMap[pos.x][pos.y] = i;
				}else{//魔物級の熾烈な争い
					int iChampionIndex = winnerMap[pos.x][pos.y];
					Person icp = people[iChampionIndex];
					if((prev_pos.x == pos.x + 1 && prev_pos.x > icp.pos.x) ||
						 prev_pos.y < icp.pos.y){
						winnerMap[pos.x][pos.y] = i;
					}
				}

				_p2.push_back({pos, angle});
			}

			for(int i=0;i<people.size();i++){
				Person person = people[i], personAfterMoving = _p2[i];
				P posAfterMoving = personAfterMoving.pos;
		
				if(winnerMap[posAfterMoving.x][posAfterMoving.y] == i){
					if(map[posAfterMoving.x][posAfterMoving.y] != 'X'){// あんたが一番(ゴールはしていませんが)
						_p3.push_back(personAfterMoving);
					}
				}else{
					_p3.push_back(person);
				}
			}

			people = _p3;
		}
	
		if(t <= 180){
			std::cout << t << std::endl;
		}else{
			std::cout << "NA" << std::endl;
		}
	}
}