//两次BFS(通俗易懂)

#include<bits/stdc++.h>
using namespace std;
char g[35][35];
int mx,my,n,m,nx,ny;
int dis1[35][35],dis2[35][35];
int dx1[]={-1,-1,-1,0,0,1,1,1};
int dy1[]={-1,0,1,-1,1,-1,0,1};
int dx2[]={-1,1,0,0};
int dy2[]={0,0,-1,1};
int main(){
    int t;cin>>t;
    while(t--){
        cin>>n>>m;
        //初始化
        memset(dis1,0x3f, sizeof(dis1));
        memset(dis2,0x3f, sizeof(dis2));
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++){
                char c;cin>>c;
                g[i][j]=c;
                if(c=='S')    mx=i,my=j;
                if(c=='*')    nx=i,ny=j;
            }
        queue<pair<int,int>> p,q;
        dis1[nx][ny]=0;//火蔓延到nx,ny的时间为第0时刻
        dis2[mx][my]=0;//角色到达位置mx,my的时间为第0时刻
        p.push({nx,ny});
        while(!p.empty()){
            int x=p.front().first;
            int y=p.front().second;
            p.pop();
            for(int i=0;i<8;i++){
                int xx=x+dx1[i],yy=y+dy1[i];
                if(xx<0||yy<0||xx>=n||yy>=m)    continue;
                //不用考虑墙,因为直接可以被烧掉
                if(dis1[xx][yy]<=dis1[x][y]+1)    continue;
                //到达xx,yy位置的时刻为前一个位置x,y的时刻的基础上+1
                dis1[xx][yy]=dis1[x][y]+1;
                p.push({xx,yy});
            }
        }
        q.push({mx,my});
        g[mx][my]=='#';
        int flag=0;
        while(!q.empty()){
            int x=q.front().first;
            int y=q.front().second;
            q.pop();
            for(int i=0;i<8;i++){
                int xx=x+dx2[i],yy=y+dy2[i];
                if(xx<0||yy<0||xx>=n||yy>=m)    continue;
                //如果为墙,那么角色无法通过
                if(g[xx][yy]=='#')    continue;
                if(dis2[xx][yy]<=dis2[x][y]+1)    continue;
                //注意是先角色移动,然后火移动
                //1.如果角色移动到一个位置之后,火不会移动到那个位置,那么角色安全否则不安全
                if(dis2[x][y]+1<dis1[xx][yy]){
                    q.push({xx,yy});
                    dis2[xx][yy]=dis2[x][y]+1;
                    if(g[xx][yy]=='E'){
                        flag=1;
                        cout<<dis2[xx][yy]<<endl;
                        break;
                    }
                }
                //2.如果角色移动到一个位置之后,火也来了,但是如果那个位置正好是出口,那么
                //角色就可以在火移动之前就逃离,输出答案,结束循环
                else if(dis2[x][y]+1==dis1[xx][yy]&&g[xx][yy]=='E'){
                    flag=1;
                    dis2[xx][yy]=dis2[x][y]+1;
                    cout<<dis2[xx][yy]<<endl;
                    break;
                }
                //其他情况就是角色到达某一个位置之前,那个位置就已经起火了,不安全
                //把已经移动到的位置标记为墙,那么之后就不用继续访问这一个位置
                g[xx][yy]=='#';
            }
            if(flag)    break;
        }
        if(!flag)    cout<<"T_T"<<endl;
    }
    return 0;
}