#include <bits/stdc++.h>
using namespace std;
#define fast() ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define all(x) (x).begin(),(x).end()
#define yes cout << "YES\n"
#define no cout << "NO\n"
#define yup printf("YES\n")
#define nope printf("NO\n")
#define PI 3.141592653589793238462643383279502884L
typedef long long ll;
const int MOD = 1000000007;
const int N=1010;
struct node {
int x, y, dir, turns;
};
int dx[]={0, 0, 1, -1};
int dy[]={1, -1, 0, 0};
int n, m, sx=-1, sy=-1, tx=-1, ty=-1;
char graph[N][N];
bool vis[N][N][4][3];
bool check(int x, int y) {
return x>=0 && y>=0 && x<n && y<m && graph[x][y]!='*';
}
int getDir(int dx, int dy) {
if(dx==0 && dy==1) return 0; //left
if(dx==0 && dy==-1) return 1; //right
if(dx==1 && dy==0) return 2; //down
return 3; //up
}
bool bfs() {
queue<node> gr;
for(int i=0; i<4; i++) {
int X=sx+dx[i], Y=sy+dy[i];
int dir=getDir(dx[i], dy[i]);
if(check(X, Y)) {
gr.push({X, Y, dir, 0});
vis[X][Y][dir][0]=true;
}
}
while(!gr.empty()) {
node curr=gr.front();
gr.pop();
if(curr.x==tx && curr.y==ty) return true;
for(int i=0; i<4; i++) {
int X=curr.x+dx[i], Y=curr.y+dy[i];
int nDir=getDir(dx[i], dy[i]), nTurns=curr.turns;
if(curr.dir != nDir) nTurns++;
if(nTurns>2) continue;
if(!check(X, Y)) continue;
//curr.turns+=(curr.dir != nDir);
if(graph[X][Y]=='T') return true;
if(!vis[X][Y][nDir][nTurns]) {
gr.push({X, Y, nDir, nTurns});
vis[X][Y][nDir][nTurns]=true;
}
}
}
return false;
}
void solve() {
cin >> n >> m;
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
cin >> graph[i][j];
if(graph[i][j]=='S') {
sx=i; sy=j;
}
if(graph[i][j]=='T') {
tx=i; ty=j;
}
}
}
if(bfs()) yes;
else no;
}
int main() {
fast();
int t=1;
//cin >> t;
while(t--)
solve();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGZhc3QoKSBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IGNpbi50aWUoMCk7IGNvdXQudGllKDApOwojZGVmaW5lIGFsbCh4KSAoeCkuYmVnaW4oKSwoeCkuZW5kKCkKI2RlZmluZSB5ZXMgY291dCA8PCAiWUVTXG4iCiNkZWZpbmUgbm8gY291dCA8PCAiTk9cbiIKI2RlZmluZSB5dXAgcHJpbnRmKCJZRVNcbiIpCiNkZWZpbmUgbm9wZSBwcmludGYoIk5PXG4iKQojZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyODg0TAp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKY29uc3QgaW50IE1PRCA9IDEwMDAwMDAwMDc7CmNvbnN0IGludCBOPTEwMTA7CgpzdHJ1Y3Qgbm9kZSB7CglpbnQgeCwgeSwgZGlyLCB0dXJuczsKfTsKCmludCBkeFtdPXswLCAwLCAxLCAtMX07CmludCBkeVtdPXsxLCAtMSwgMCwgMH07CgppbnQgbiwgbSwgc3g9LTEsIHN5PS0xLCB0eD0tMSwgdHk9LTE7CmNoYXIgZ3JhcGhbTl1bTl07CmJvb2wgdmlzW05dW05dWzRdWzNdOwoKYm9vbCBjaGVjayhpbnQgeCwgaW50IHkpIHsKCXJldHVybiB4Pj0wICYmIHk+PTAgJiYgeDxuICYmIHk8bSAmJiBncmFwaFt4XVt5XSE9JyonOwp9CgppbnQgZ2V0RGlyKGludCBkeCwgaW50IGR5KSB7CglpZihkeD09MCAmJiBkeT09MSkgcmV0dXJuIDA7IC8vbGVmdAoJaWYoZHg9PTAgJiYgZHk9PS0xKSByZXR1cm4gMTsgLy9yaWdodAoJaWYoZHg9PTEgJiYgZHk9PTApIHJldHVybiAyOyAvL2Rvd24KCXJldHVybiAzOyAvL3VwCn0KCmJvb2wgYmZzKCkgewoJcXVldWU8bm9kZT4gZ3I7CgoJZm9yKGludCBpPTA7IGk8NDsgaSsrKSB7CgkJaW50IFg9c3grZHhbaV0sIFk9c3krZHlbaV07CgkJaW50IGRpcj1nZXREaXIoZHhbaV0sIGR5W2ldKTsKCgkJaWYoY2hlY2soWCwgWSkpIHsKCQkJZ3IucHVzaCh7WCwgWSwgZGlyLCAwfSk7CgkJCXZpc1tYXVtZXVtkaXJdWzBdPXRydWU7CgkJfQoJfQoKCXdoaWxlKCFnci5lbXB0eSgpKSB7CgkJbm9kZSBjdXJyPWdyLmZyb250KCk7CgkJZ3IucG9wKCk7CgoJCWlmKGN1cnIueD09dHggJiYgY3Vyci55PT10eSkgcmV0dXJuIHRydWU7CgkJCgkJZm9yKGludCBpPTA7IGk8NDsgaSsrKSB7CgkJCWludCBYPWN1cnIueCtkeFtpXSwgWT1jdXJyLnkrZHlbaV07CgkJCWludCBuRGlyPWdldERpcihkeFtpXSwgZHlbaV0pLCBuVHVybnM9Y3Vyci50dXJuczsKCgkJCWlmKGN1cnIuZGlyICE9IG5EaXIpIG5UdXJucysrOwoJCQlpZihuVHVybnM+MikgY29udGludWU7CgkJCWlmKCFjaGVjayhYLCBZKSkgY29udGludWU7CgkJCS8vY3Vyci50dXJucys9KGN1cnIuZGlyICE9IG5EaXIpOwoJCQlpZihncmFwaFtYXVtZXT09J1QnKSByZXR1cm4gdHJ1ZTsKCgkJCWlmKCF2aXNbWF1bWV1bbkRpcl1bblR1cm5zXSkgewoJCQkJZ3IucHVzaCh7WCwgWSwgbkRpciwgblR1cm5zfSk7CgkJCSAgICB2aXNbWF1bWV1bbkRpcl1bblR1cm5zXT10cnVlOwoJCQl9CgkJfQoKCX0KCglyZXR1cm4gZmFsc2U7Cn0KCnZvaWQgc29sdmUoKSB7CgljaW4gPj4gbiA+PiBtOwoKCWZvcihpbnQgaT0wOyBpPG47IGkrKykgewoJCWZvcihpbnQgaj0wOyBqPG07IGorKykgewoJCQljaW4gPj4gZ3JhcGhbaV1bal07CgoJCQlpZihncmFwaFtpXVtqXT09J1MnKSB7CgkJCQlzeD1pOyBzeT1qOwoJCQl9CgkJCWlmKGdyYXBoW2ldW2pdPT0nVCcpIHsKCQkJCXR4PWk7IHR5PWo7CgkJCX0KCgkJfQoJfQoKCWlmKGJmcygpKSB5ZXM7CgllbHNlIG5vOwp9CgppbnQgbWFpbigpIHsKCWZhc3QoKTsKCglpbnQgdD0xOwoJLy9jaW4gPj4gdDsKCXdoaWxlKHQtLSkKCXNvbHZlKCk7CgoKCXJldHVybiAwOwp9Cg==