#include <iostream>
#include <cstring>

using namespace std;

const int max_size = 31;

void p(char a[max_size][max_size], int sizei, int sizej = 0, char *padding = "", int offseti = 0, int offsetj = 0){
	if(!sizej) sizej = sizei;
	for(int i = 0; i < sizei; i++){
		for(int j = 0; j < sizej; j++){
			cout << a[offseti+i][offsetj+j] << padding;
		}
		cout << endl;
	}
}

char dirchr[] = "ENWS";
int dx[] = {1, 0, -1, 0};
int dy[] = {0, -1, 0, 1};

int dirnum(char d){
	for(int i = 0; i < 4; i++){
		if(dirchr[i] == d) return i;
	}
	//cout << "invalid char" << d << endl;
	//exit(0);
	return -1;
}

void changeDirection(char (*_map)[max_size], int i, int j){
	int startdir = dirnum(_map[i][j]) + 3; // 現在の向きの右から
	for(int k = 0; k < 4; k++){
		int dir = (startdir+k)%4;
		char destchar = _map[i+dy[dir]][j+dx[dir]];
		if(destchar == '.' || destchar == 'X'){
			//cout << "(" << i << ", " << j << "): " << _map[i][j] << "->" << dirchr[dir] << endl;
			_map[i][j] = dirchr[dir];
			return;
		}
	}
}

void move(char (*_map)[max_size], int i, int j){
	int dir = dirnum(_map[i][j]);
	char destchar = _map[i+dy[dir]][j+dx[dir]];
	if(destchar == '.'){
		_map[i+dy[dir]][j+dx[dir]] = _map[i][j];
		_map[i][j] = 'Z';
	}
	if(destchar == 'X'){
		_map[i+dy[dir]][j+dx[dir]] = 'Y'; // 同時脱出制限用
		_map[i][j] = 'Z';
	}
}

void peopleAct(char (*_map)[max_size], int i, int j, void (*func)(char (*)[max_size],int, int), char* filter = "ENWS", int filtersize = 4){
	for(int k = 0; k < filtersize; k++){
		if(_map[i][j] == filter[k]){
			(*func)(_map, i, j);
			break;
		}
	}
}

int main(){
	char square[max_size][max_size];

	int w, h;
	while(cin >> w >> h){
		if(!w && !h) break;
		for(int i = 0; i < h; i++){
			for(int j = 0; j < w; j++){
				cin >> square[i][j];
			}
		}
		int time = 0;
		for(time = 0; time <= 180; time++){

			// 人がいなければ避難終了
			for(int i = 0; i < h; i++){
				for(int j = 0; j < w; j++){
					char c = square[i][j];
					if(c != '.' && c != '#' && c != 'X'){
						goto nextloop;
					}
				}
			}
			break;

nextloop: ;
			// 向きを変える処理
			for(int i = 0; i < h; i++){
				for(int j = 0; j < w; j++){
					peopleAct(square, i, j, changeDirection);
					//for(int k = 0; k < 4; k++){
					//	if(square[i][j] == dirchr[k]){
					//		changeDirection(square, i, j);
					//		break;
					//	}
					//}
				}
			}

			// 移動する処理
			// 左、下、右、上の順に処理

			for(int i = 0; i < h; i++){
				for(int j = 0; j < w; j++){ // 左から
					peopleAct(square, i, j, move, "W", 1);
				}
			}

			for(int i = h-1; i >= 0; i--){ // 下から
				for(int j = 0; j < w; j++){
					peopleAct(square, i, j, move, "S", 1);
				}
			}

			for(int i = 0; i < h; i++){
				for(int j = w-1; j >= 0; j-- ){ // 右から
					peopleAct(square, i, j, move, "E", 1);
				}
			}

			for(int i = 0; i < h; i++){ // 上から
				for(int j = 0; j < w; j++){
					peopleAct(square, i, j, move, "N", 1);
				}
			}

			// 後処理
			for(int i = 0; i < h; i++){
				for(int j = 0; j < w; j++){
					if(square[i][j] == 'Y'){
						square[i][j] = 'X';
					}
					if(square[i][j] == 'Z'){
						square[i][j] = '.';
					}
				}
			}

			//cout << endl;
			//p(square, h, w);
			//getchar();
		}

		//p(square, h, w);

		if(time <= 180){
			cout << time << endl;
		}else{
			cout << "NA" << endl;
		}
	}

	return 0;
}

Measured memory_bytes: 1168