#include <queue>
#include<vector>
#include<string>
#include<algorithm>


#define int long long
#define endl "\n"
#define vt vector
#define pb push_back
using namespace std;
const int IMF=1e18+5;

const int dx[4]={1,-1,0,0};
const int dy[4]={0,0,1,-1};

struct T{
    int ln,lm,d;
    T(int x,int y,int z){
        ln=x,lm=y,d=z;
    }
    bool operator>(const T&other) const{
        return d>other.d;
    }
};

signed main(){
    int q;
    cin>>q;
    while(q--){
        int n,m,h;cin>>n>>m>>h;
        vt<vt<int>> op(n,vt<int>(m,0));
        vt<string> ed(n);
        int sn=-1,sm=-1;
        int fn=-1,fm=-1;
        for(int i=0;i<n;i++){
            cin>>ed[i];
          for(int j=0;j<m;j++){
            if(ed[i][j]=='S') sn=i,sm=j,op[i][j]=0;
            else if(ed[i][j]=='T') fn=i,fm=j,op[i][j]=0;
            else op[i][j]=ed[i][j]-'0';
          }
        }
       priority_queue<T,vt<T>,greater<T>> res;
       res.push({sn,sm,0});
       vt<vt<bool>> vst(n,vt<bool>(m,false));
       vt<vt<int>> dis(n,vt<int>(m,IMF));
       dis[sn][sm]=0;
       while(!res.empty()){
        auto[nn,nm,nd]=res.top();
        res.pop();
        if(vst[nn][nm]) continue;
        vst[nn][nm]=true;
        for(int i=0;i<4;i++){
            int nx=nn+dx[i];
            int ny=nm+dy[i];
            if(nx>=0 && nx<n && ny>=0 && ny<m){
                if(dis[nx][ny]>op[nx][ny]+nd){
                    dis[nx][ny]=op[nx][ny]+nd;
                    res.push({nx,ny,dis[nx][ny]});
                }
            }
        }
       }
        if(dis[fn][fm]>=h) cout<<"No"<<endl;
       else cout<<"Yes"<<endl;
    }
}