#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
char map[45][45];
char map2[45][45];
int n,m;
int dir1_left[][2]={1,0,0,-1,-1,0};
int dir2_left[][2]={0,-1,-1,0,0,1};
int dir3_left[][2]={-1,0,0,1,1,0};
int dir4_left[][2]={0,1,1,0,0,-1};
int dir1_r[][2]={-1,0,0,-1,1,0};
int dir2_r[][2]={0,1,-1,0,0,-1};
int dir3_r[][2]={1,0,0,1,-1,0};
int dir4_r[][2]={0,-1,1,0,0,1};
int dir[][2]={0,1,0,-1,1,0,-1,0};
int pace_l;
int pace_r;
int flag;
int pace;
int legal(int x,int y)
{
if (x>=1&&y>=1&&x<=n&&y<=m)
return 1;
return 0;
}
struct node
{
int x,y;
int time;
};
queue <node> qq;
int bfs(int x,int y)
{
node tmp;
while(!qq.empty())
{
tmp=qq.front();
qq.pop();
int i;
for (i=0;i<4;i++)
{
int r=tmp.x+dir[i][0];
int c=tmp.y+dir[i][1];
if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
{
node tt=tmp;
tt.x=r;
tt.y=c;
tt.time++;
if (map[r][c]=='E')
{
pace=tt.time;
return 0;
}
map[r][c]='#';
qq.push(tt);
}
}
}
}
int dfs_l(int x,int y,int posi)
{
int i;
if (map[x][y]=='E')
{
pace_l=pace;
flag=1;
return 0;
}
if (posi==1)
{
for (i=0;i<3;i++)
{
int r=x+dir1_left[i][0];
int c=y+dir1_left[i][1];
if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
{
// if (map[r][c]=='.') map[r][c]='#';
int pposi;
if (i==0) pposi=4;
if (i==1) pposi=1;
if (i==2) pposi=2;
pace++;
dfs_l(r,c,pposi);
pace++;
if (flag==1)
return 0;
map[r][c]='.';
}
}
}
if (posi==2)
{
for (i=0;i<3;i++)
{
int r=x+dir2_left[i][0];
int c=y+dir2_left[i][1];
if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
{
// if (map[r][c]=='.') map[r][c]='#';
int pposi;
if (i==0) pposi=1;
if (i==1) pposi=2;
if (i==2) pposi=3;
pace++;
dfs_l(r,c,pposi);
pace++;
if (flag==1)
return 0;
map[r][c]='.';
}
}
}
if (posi==3)
{
for (i=0;i<3;i++)
{
int r=x+dir3_left[i][0];
int c=y+dir3_left[i][1];
if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
{
// if (map[r][c]=='.') map[r][c]='#';
int pposi;
if (i==0) pposi=2;
if (i==1) pposi=3;
if (i==2) pposi=4;
pace++;
dfs_l(r,c,pposi);
pace++;
if (flag==1)
return 0;
map[r][c]='.';
}
}
}
if (posi==4)
{
for (i=0;i<3;i++)
{
int r=x+dir4_left[i][0];
int c=y+dir4_left[i][1];
if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
{
// if (map[r][c]=='.') map[r][c]='#';
int pposi;
if (i==0) pposi=3;
if (i==1) pposi=4;
if (i==2) pposi=1;
pace++;
dfs_l(r,c,pposi);
pace++;
if (flag==1)
return 0;
map[r][c]='.';
}
}
}
return 0;
}
int dfs_r(int x,int y,int posi)
{
int i;
if (map[x][y]=='E')
{
pace_r=pace;
flag=1;
return 0;
}
if (posi==1)
{
for (i=0;i<3;i++)
{
int r=x+dir1_r[i][0];
int c=y+dir1_r[i][1];
if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
{
// if (map[r][c]=='.') map[r][c]='#';
int pposi;
if (i==0) pposi=2;
if (i==1) pposi=1;
if (i==2) pposi=4;
pace++;
dfs_r(r,c,pposi);
pace++;
if (flag==1)
return 0;
map[r][c]='.';
}
}
}
if (posi==2)
{
for (i=0;i<3;i++)
{
int r=x+dir2_r[i][0];
int c=y+dir2_r[i][1];
if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
{
// if (map[r][c]=='.') map[r][c]='#';
int pposi;
if (i==0) pposi=3;
if (i==1) pposi=2;
if (i==2) pposi=1;
pace++;
dfs_r(r,c,pposi);
pace++;
if (flag==1)
return 0;
map[r][c]='.';
}
}
}
if (posi==3)
{
for (i=0;i<3;i++)
{
int r=x+dir3_r[i][0];
int c=y+dir3_r[i][1];
if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
{
// if (map[r][c]=='.') map[r][c]='#';
int pposi;
if (i==0) pposi=4;
if (i==1) pposi=3;
if (i==2) pposi=2;
pace++;
dfs_r(r,c,pposi);
pace++;
if (flag==1)
return 0;
map[r][c]='.';
}
}
}
if (posi==4)
{
for (i=0;i<3;i++)
{
int r=x+dir4_r[i][0];
int c=y+dir4_r[i][1];
if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
{
// if (map[r][c]=='.') map[r][c]='#';
int pposi;
if (i==0) pposi=1;
if (i==1) pposi=4;
if (i==2) pposi=3;
pace++;
dfs_r(r,c,pposi);
pace++;
if (flag==1)
return 0;
map[r][c]='.';
}
}
}
return 0;
}
int main()
{
int i,j;
int t;
cin>>t;
while(t--)
{
memset(map,0,sizeof(map));
int sx,sy;
cin>>m>>n;
getchar();
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
scanf("%c",&map[i][j]);
map2[i][j]=map[i][j];
if (map[i][j]=='S')
{
sx=i;
sy=j;
}
}
getchar();
}
int posi;
if (legal(sx+1,sy)&&map[sx+1][sy]=='.')
posi=4;
if (legal(sx,sy+1)&&map[sx][sy+1]=='.')
posi=3;
if (legal(sx-1,sy)&&map[sx-1][sy]=='.')
posi=2;
if (legal(sx,sy-1)&&map[sx][sy-1]=='.')
posi=1;
flag=0;
pace=1;
dfs_l(sx,sy,posi);
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
map[i][j]=map2[i][j];
}
}
flag=0;
pace=1;
dfs_r(sx,sy,posi);
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
map[i][j]=map2[i][j];
}
}
pace=1;
while(!qq.empty())
qq.pop();
node tmp;
tmp.x=sx;
tmp.y=sy;
tmp.time=1;
qq.push(tmp);
bfs(sx,sy);
printf("%d %d %d\n",pace_l,pace_r,pace);
}
return 0;
}