Problem: The huge maze The Squares has been newly completed in the famous theme park. Evacuation drills must be conducted under the guidance of the fire department, but the time required for the drills cannot be predicted due to the huge maze. Therefore, you decided to develop an evacuation drill simulator based on the following specifications.

As shown in Fig. 1, the giant maze is represented by W × H squares of horizontal W and vertical H. Each square is either a passage (white square), a wall (brown square), or an emergency exit (green square). The circles in the figure represent people, and the lowercase letters (E, W, S, N) in them represent the direction in which the person is facing (north, south, east, and west). The figure is drawn with the upward direction facing north.


<image>

Figure 1




People in the giant maze initially stand facing either north, south, east, or west. Each person attempts to move in 1-second increments at the same time, following the steps below.

1. Look at the right, front, left, and back squares in the direction you are currently facing, and turn to the first vacant aisle or emergency exit you find. If there is no such square, the direction will not change.
2. If the square in front of you is open and not in front of another person, move it. If there are multiple people with the same square in front of you, the selected one will move in the order of the people in that square, east, north, west, and south.



Those who arrive at the emergency exit after moving will evacuate safely and disappear from the maze.

Create a program that inputs the given huge maze and the location information of people and outputs the time when all people finish evacuating. If it takes more than 180 seconds to escape, output NA. Maze and person location information is given by the characters in rows H and columns W. The meaning of each character is as follows.

: Wall
.: Floor
X: Emergency exit
E: People facing east
N: People facing north
W: People facing west
S: People facing south


The boundary between the maze and the outside is either the wall # or the emergency exit X. In addition, there is always one or more people in the huge maze.



Input

A sequence of multiple datasets is given as input. The end of the input is indicated by two lines of zeros. Each dataset is given in the following format:


W H
str1
str2
::
strH


The first line gives the horizontal size W of the maze and the vertical size H (1 ≤ W, H ≤ 30). The following H line is given the string stri (length W) that represents the i-th line of the maze.

The number of datasets does not exceed 50.

Output

For each input dataset, the time when all people finish evacuating is output on one line.

Examples

Input

10 3
##########
#E.......X
##########
4 4
####
#N.#
#..X
####
5 5
#####
#N..#
###.X
#S..#
#####
6 6
######
#..#X#
#.EE.#
####N#
#....#
######
8 8
##X#####
#....E.#
#####.##
#.#...##
#.W.#..#
#.#.N#.X
#X##.#.#
########
0 0


Output

8
NA
9
16
10


Input

10 3

E.......X

4 4

N.#
..X

5 5

N..#
.X
S..#

6 6

..#X#
.EE.#
N#
....#

8 8
X#####
....E.#
.##
.#...##
.W.#..#
.#.N#.X
X##.#.#

0 0


Output

8
NA
9
16
10

Solution (in JAVA):

Solution:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;

public class Main {

	static final int[][] dirpe = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
	static final int[][] dirpn = {{0, 1}, {-1, 0}, {0, -1}, {1, 0}};
	static final int[][] dirpw = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
	static final int[][] dirps = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};

	static final char[] dirce = {'S', 'E', 'N', 'W'};
	static final char[] dircn = {'E', 'N', 'W', 'S'};
	static final char[] dircw = {'N', 'W', 'S', 'E'};
	static final char[] dircs = {'W', 'S', 'E', 'N'};

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line = "";

		while (!(line = br.readLine()).equals("0 0")) {
			int w = Integer.parseInt(line.substring(0, line.indexOf(' ')));
			int h = Integer.parseInt(line.substring(line.indexOf(' ') + 1));
			char[][] mazec = new char[h][w];
			int[][] mazei = new int[h][w];

			ArrayDeque<Seeker> queue = new ArrayDeque<Seeker>();

			for (int i = 0; i < h; i++) {
				line = br.readLine();
				for (int j = 0; j < w; j++) {
					mazec[i][j] = line.charAt(j);
					if ("SENW".indexOf(mazec[i][j]) != -1) {
						queue.add(new Seeker(mazec[i][j], new int[]{i, j}));
					}
				}
			}

			int elapse = 0;
			while (queue.size() > 0 && elapse < 180) {

				for (Seeker s : queue) {
					int[][] dirp = null;
					char[] dirc = null;
					switch (s.dir) {
						case 'E':
							dirp = dirpe;
							dirc = dirce;
							break;
						case 'N':
							dirp = dirpn;
							dirc = dircn;
							break;
						case 'W':
							dirp = dirpw;
							dirc = dircw;
							break;
						case 'S':
							dirp = dirps;
							dirc = dircs;
							break;
					}
					for (int i = 0; i < 4; i++) {
						int next_y = s.curr[0] + dirp[i][0];
						int next_x = s.curr[1] + dirp[i][1];
						char next_c = mazec[next_y][next_x];
						if (next_c == '.' || next_c == 'X') {
							//方向転換 & 移動先座標設定
							s.dir = dirc[i];
							s.next[0] = next_y;
							s.next[1] = next_x;
							//優先度上書き
							if (mazei[next_y][next_x] < s.prio()) {
								mazei[next_y][next_x] = s.prio();
							}
							break;
						}
					}
				}
				//移動
				for (Seeker s : queue) {
					if (mazei[s.next[0]][s.next[1]] == s.prio()) {
						mazec[s.curr[0]][s.curr[1]] = '.';
						mazei[s.next[0]][s.next[1]] = 0;
						if (mazec[s.next[0]][s.next[1]] == 'X') {
							s.gone = true;
						} else {
							mazec[s.next[0]][s.next[1]] = s.dir;
							s.curr[0] = s.next[0];
							s.curr[1] = s.next[1];
						}
					}
				}
				//移動(脱出)
				int i = queue.size();
				for (int j = 0; j < i; j++) {
					Seeker s = queue.poll();
					if (!s.gone) {
						queue.offer(s);
					}
				}
				elapse++;
			}
			//結果出力
			if (queue.isEmpty()) {
				System.out.println(elapse);
			} else {
				System.out.println("NA");
			}
		}
	}
}

class Seeker {

	static final int priow = 4;
	static final int prios = 3;
	static final int prioe = 2;
	static final int prion = 1;

	char dir;
	int[] curr;
	int[] next;
	boolean gone;

	Seeker(char dir, int[] curr) {
		this.dir = dir;
		this.curr = curr;
		this.next = new int[2];
	}

	int prio() {
		switch (this.dir) {
			case 'W':
				return priow;
			case 'S':
				return prios;
			case 'E':
				return prioe;
			case 'N':
				return prion;
			default:
				return 0;
		}
	}

}