#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <iterator>

#define REP(i,k,n) for(int i=k;i<n;i++)
#define rep(i,n) for(int i=0;i<n;i++)

using namespace std;

string s[30];
int h,w;
int dx[4] = {1,0,-1,0},dy[4] = {0,1,0,-1};

pair<int,int> NextPoint(int y,int x)
{
	pair<int,int> p;
	if(s[y][x] == 'E')
	{
		if(s[y+1][x] == '.' || s[y+1][x] == 'X')
		{
			s[y][x] = 'S';

			p.first = y+1;
			p.second = x;
			return p;
		}
		else if(s[y][x+1] == '.' || s[y][x+1] == 'X')
		{
			s[y][x] = 'E';

			p.first = y;
			p.second = x+1;
			return p;
		}
		else if(s[y-1][x] == '.' || s[y-1][x] == 'X')
		{
			s[y][x] = 'N';

			p.first = y-1;
			p.second = x;
			return p;
		}
		else if(s[y][x-1] == '.' || s[y][x-1] == 'X')
		{
			s[y][x] = 'W';

			p.first = y;
			p.second = x-1;
			return p;
		}
	}
	else if(s[y][x] == 'N')
	{
		if(s[y][x+1] == '.' || s[y][x+1] == 'X')
		{
			s[y][x] = 'E';

			p.first = y;
			p.second = x+1;
			return p;
		}
		else if(s[y-1][x] == '.' || s[y-1][x] == 'X')
		{
			s[y][x] = 'N';

			p.first = y-1;
			p.second = x;
			return p;
		}
		else if(s[y][x-1] == '.' || s[y][x-1] == 'X')
		{
			s[y][x] = 'W';

			p.first = y;
			p.second = x-1;
			return p;
		}
		else if(s[y+1][x] == '.' || s[y+1][x] == 'X')
		{
			s[y][x] = 'S';

			p.first = y+1;
			p.second = x;
			return p;
		}
	}
	else if(s[y][x] == 'W')
	{
		if(s[y-1][x] == '.' || s[y-1][x] == 'X')
		{
			s[y][x] = 'N';

			p.first = y-1;
			p.second = x;
			return p;
		}
		else if(s[y][x-1] == '.' || s[y][x-1] == 'X')
		{
			s[y][x] = 'W';

			p.first = y;
			p.second = x-1;
			return p;
		}
		else if(s[y+1][x] == '.' || s[y+1][x] == 'X')
		{
			s[y][x] = 'S';

			p.first = y+1;
			p.second = x;
			return p;
		}
		else if(s[y][x+1] == '.' || s[y][x+1] == 'X')
		{
			s[y][x] = 'E';

			p.first = y;
			p.second = x+1;
			return p;
		}
	}
	else if(s[y][x] == 'S')
	{
		if(s[y][x-1] == '.' || s[y][x-1] == 'X')
		{
			s[y][x] = 'W';

			p.first = y;
			p.second = x-1;
			return p;
		}
		else if(s[y+1][x] == '.' || s[y+1][x] == 'X')
		{
			s[y][x] = 'S';

			p.first = y+1;
			p.second = x;
			return p;
		}
		else if(s[y][x+1] == '.' || s[y][x+1] == 'X')
		{
			s[y][x] = 'E';
			p.first = y;
			p.second = x+1;
			return p;
		}
		else if(s[y-1][x] == '.' || s[y-1][x] == 'X')
		{
			s[y][x] = 'N';

			p.first = y-1;
			p.second = x;
			return p;
		}
	}
}

bool can(int y,int x)
{
	if(0 <= y & y < h && 0 <= x && x < w)
	{
		return true;
	}
	else return false;
}

bool isPerson(int y,int x)
{
	if(s[y][x] == 'E' || s[y][x] == 'W' || s[y][x] == 'S' || s[y][x] == 'N')
	{
		return true;
	}
	else return false;
}

bool onPerson(int h,int w)
{
	bool flag = false;

	rep(i,h)
	{
		rep(j,w)
		{
			if(s[i][j] == 'E' || s[i][j] == 'N' || s[i][j] == 'W' || s[i][j] == 'S')
			{
				flag = true;
			}
		}
	}

	return flag;
}

void printS(int h,int w)
{
	rep(i,h)
	{
		rep(j,w)
		{
			cout << s[i][j];
		}
		cout << endl;
	}
}

int main()
{
	map<pair<int,int>,int> cmp;

	cmp[pair<int,int>(0,1)] = 1;
	cmp[pair<int,int>(-1,0)] = 2;
	cmp[pair<int,int>(0,-1)] = 3;
	cmp[pair<int,int>(1,0)] = 4;


	while(cin >> w >> h)
	{
		if(w == 0 && h == 0) break;

		rep(i,h)
		{
			cin >> s[i];
		}

		if(!onPerson(h,w))
		{
			cout << 0 << endl;
			return 0;
		}


		bool flag = false;

		rep(k,180)
		{
			vector<pair<int,int> > v;
			map<pair<int,int>,vector<pair<int,int> > > ma;
			rep(i,h) 
			{
				rep(j,w) 
				{	
					if(isPerson(i,j)) 
					{
						//v.push_back(NextPoint(i,j));
						ma[NextPoint(i,j)].push_back(make_pair(i,j));
					}
				}
			}
			

			bool used[30][30];
			rep(i,h) rep(j,w) used[i][j] = true;

			map<pair<int,int>,vector<pair<int,int> > >::iterator ite;
			for(ite = ma.begin();ite != ma.end();ite++)
			{
				int nowy = ite->first.first;
				int nowx = ite->first.second;

				rep(j,ite->second.size())
				{
					int ny = (ite->second)[j].first;
					int nx = (ite->second)[j].second;
				
					if(cmp[pair<int,int>(ny-nowy,nx-nowx)] == 1 && used[nowy][nowx] && used[ny][nx])
					{
						if(s[nowy][nowx] == 'X')
						{
							s[ny][nx] = '.';
						}
						else swap(s[ny][nx],s[nowy][nowx]);

						used[nowy][nowx] = false;
						used[ny][nx] = false;
					}
				}

				rep(j,ite->second.size())
				{
					int ny = (ite->second)[j].first;
					int nx = (ite->second)[j].second;

					if(cmp[pair<int,int>(ny-nowy,nx-nowx)] == 2 && used[nowy][nowx] && used[ny][nx])
					{
						if(s[nowy][nowx] == 'X')
						{
							s[ny][nx] = '.';
						}
						else swap(s[ny][nx],s[nowy][nowx]);

						used[nowy][nowx] = false;
						used[ny][nx] = false;
					}
				}
				rep(j,ite->second.size())
				{
					int ny = (ite->second)[j].first;
					int nx = (ite->second)[j].second;

					if(cmp[pair<int,int>(ny-nowy,nx-nowx)] == 3 && used[nowy][nowx] && used[ny][nx])
					{
						if(s[nowy][nowx] == 'X') s[ny][nx] = '.';
						else swap(s[ny][nx],s[nowy][nowx]);

						used[ny][nx] = false;
						used[nowy][nowx] = false;
					}
				}

				rep(j,ite->second.size())
				{
					int ny = (ite->second)[j].first;
					int nx = (ite->second)[j].second;

					if(cmp[pair<int,int>(ny-nowy,nx-nowx)] == 4 && used[nowy][nowx] && used[ny][nx])
					{
						
						if(s[nowy][nowx] == 'X')
						{
							s[ny][nx] = '.';
						}
						else swap(s[ny][nx],s[nowy][nowx]);

						used[nowy][nowx] = false;
						used[ny][nx] = false;
					}
				}
			}

			if(!onPerson(h,w))
			{
				cout << k+1 << endl;
				flag = true;
				break;
			}
			

			

			if(!onPerson(h,w))
			{
				cout << k+1 << endl;
				flag = true;
				break;
			}

		}

		if(!flag) cout << "NA" << endl;

	}
	return 0;
}

Measured memory_bytes: 1236