#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<stdlib.h>
#include<vector>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
const int MAXN=1000+5;
int kase,n,m,sx,sy,ans;
int mat[MAXN][MAXN],vis[MAXN][MAXN];
int dir[][2]={{0,0},{0,1},{1,0},{0,-1},{-1,0}};
char str[MAXN];
bool flag;
struct node
{
int x,y;
int step;
}s;
bool ok(int x,int y)
{
if(1<=x && x<=n && 1<=y && y<=m)
return true;
return false;
}
void BFS()
{
memset(vis,0,sizeof(vis));
queue<node> Q;
s.x=sx,s.y=sy;
s.step=0;
vis[sx][sy]=1;
Q.push(s);
while(!Q.empty())
{
node now,next;
now=Q.front();
Q.pop();
for(int i=1;i<=4;i++)
{
int xx=now.x+dir[i][0];
int yy=now.y+dir[i][1];
if(ok(xx,yy) && !vis[xx][yy] && mat[xx][yy]!=-1)
{
if(mat[xx][yy]==i)
{
if(!ok(xx+dir[i][0],yy+dir[i][1]))
{
ans=now.step+1;
flag=true;
return ;
}
next.x=xx;
next.y=yy;
next.step=now.step+1;
vis[xx][yy]=1;
Q.push(next);
}
else if(mat[xx][yy]==0)
{
next.x=xx;
next.y=yy;
next.step=now.step;
vis[xx][yy]=1;
Q.push(next);
}
}
}
}
}
int main()
{
scanf("%d",&kase);
while(kase--)
{
memset(mat,0,sizeof(mat));
scanf("%d %d\n",&n,&m);
//getchar();
n=2*n+1;
m=2*m+1;
for(int i=1;i<=n;i++)
{
gets(str+1);
for(int j=1;j<=m;j++)
{
if(str[j]==‘-‘ || str[j]==‘|‘ || str[j]==‘*‘) mat[i][j]=-1;
if(str[j]==‘ ‘) mat[i][j]=0;
if(str[j]==‘E‘) mat[i][j]=1;
if(str[j]==‘S‘) mat[i][j]=2;
if(str[j]==‘W‘) mat[i][j]=3;
if(str[j]==‘N‘) mat[i][j]=4;
if(str[j]==‘O‘)
{
sx=i;
sy=j;
mat[i][j]=0;
}
}
}
flag=false;
BFS();
if(flag) printf("%d\n",ans);
else printf("-1\n");
}
return 0;
}