#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 yesc cout << "YES\n"
#define noc 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;
char graph[1010][1010];
bool vis[1010][1010][4];
bool check(int x, int y, int dir) {
return x>=0 && y>=0 && x<n && y<m && !vis[x][y][dir] && 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, dir)) {
gr.push({X, Y, dir, 0});
vis[X][Y][dir]=true;
}
}
while(!gr.empty()) {
node curr=gr.front();
gr.pop();
if(graph[curr.x][curr.y]=='T') 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, nDir)) continue;
//curr.turns+=(curr.dir != nDir);
if(graph[X][Y]=='T') return true;
gr.push({X, Y, nDir, nTurns});
vis[X][Y][nDir]=true;
}
}
return false;
}
void solve() {
scanf("%d %d", &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(bfs()) yup;
else nope;
}
int main() {
fast();
int t=1;
//cin >> t;
while(t--)
solve();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGZhc3QoKSBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IGNpbi50aWUoMCk7IGNvdXQudGllKDApOwojZGVmaW5lIGFsbCh4KSAoeCkuYmVnaW4oKSwoeCkuZW5kKCkKI2RlZmluZSB5ZXNjIGNvdXQgPDwgIllFU1xuIgojZGVmaW5lIG5vYyBjb3V0IDw8ICJOT1xuIgojZGVmaW5lIHl1cCBwcmludGYoIllFU1xuIikKI2RlZmluZSBub3BlIHByaW50ZigiTk9cbiIpCiNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI4ODRMCnR5cGVkZWYgbG9uZyBsb25nIGxsOwpjb25zdCBpbnQgTU9EID0gMTAwMDAwMDAwNzsKY29uc3QgaW50IE49MTAxMDsKCnN0cnVjdCBub2RlIHsKCWludCB4LCB5LCBkaXIsIHR1cm5zOwp9OwoKaW50IGR4W109ezAsIDAsIDEsIC0xfTsKaW50IGR5W109ezEsIC0xLCAwLCAwfTsKCmludCBuLCBtLCBzeD0tMSwgc3k9LTE7CmNoYXIgZ3JhcGhbMTAxMF1bMTAxMF07CmJvb2wgdmlzWzEwMTBdWzEwMTBdWzRdOwoKYm9vbCBjaGVjayhpbnQgeCwgaW50IHksIGludCBkaXIpIHsKCXJldHVybiB4Pj0wICYmIHk+PTAgJiYgeDxuICYmIHk8bSAmJiAhdmlzW3hdW3ldW2Rpcl0gJiYgZ3JhcGhbeF1beV0hPScqJzsKfQoKaW50IGdldERpcihpbnQgZHgsIGludCBkeSkgewoJaWYoZHg9PTAgJiYgZHk9PTEpIHJldHVybiAwOyAvL2xlZnQKCWlmKGR4PT0wICYmIGR5PT0tMSkgcmV0dXJuIDE7IC8vcmlnaHQKCWlmKGR4PT0xICYmIGR5PT0wKSByZXR1cm4gMjsgLy9kb3duCglyZXR1cm4gMzsgLy91cAp9Cgpib29sIGJmcygpIHsKCXF1ZXVlPG5vZGU+IGdyOwoKCWZvcihpbnQgaT0wOyBpPDQ7IGkrKykgewoJCWludCBYPXN4K2R4W2ldLCBZPXN5K2R5W2ldOwoJCWludCBkaXI9Z2V0RGlyKGR4W2ldLCBkeVtpXSk7CgoJCWlmKGNoZWNrKFgsIFksIGRpcikpIHsKCQkJZ3IucHVzaCh7WCwgWSwgZGlyLCAwfSk7CgkJCXZpc1tYXVtZXVtkaXJdPXRydWU7CgkJfQoJfQoKCXdoaWxlKCFnci5lbXB0eSgpKSB7CgkJbm9kZSBjdXJyPWdyLmZyb250KCk7CgkJZ3IucG9wKCk7CgoJCWlmKGdyYXBoW2N1cnIueF1bY3Vyci55XT09J1QnKSByZXR1cm4gdHJ1ZTsKCQkKCQlmb3IoaW50IGk9MDsgaTw0OyBpKyspIHsKCQkJaW50IFg9Y3Vyci54K2R4W2ldLCBZPWN1cnIueStkeVtpXTsKCQkJaW50IG5EaXI9Z2V0RGlyKGR4W2ldLCBkeVtpXSksIG5UdXJucz1jdXJyLnR1cm5zOwoKCQkJaWYoY3Vyci5kaXIgIT0gbkRpcikgblR1cm5zKys7CgkJCWlmKG5UdXJucz4yKSBjb250aW51ZTsKCQkJaWYoIWNoZWNrKFgsIFksIG5EaXIpKSBjb250aW51ZTsKCQkJLy9jdXJyLnR1cm5zKz0oY3Vyci5kaXIgIT0gbkRpcik7CgkJCWlmKGdyYXBoW1hdW1ldPT0nVCcpIHJldHVybiB0cnVlOwoKCQkJZ3IucHVzaCh7WCwgWSwgbkRpciwgblR1cm5zfSk7CgkJCXZpc1tYXVtZXVtuRGlyXT10cnVlOwoJCX0KCgl9CgoJcmV0dXJuIGZhbHNlOwp9Cgp2b2lkIHNvbHZlKCkgewoJc2NhbmYoIiVkICVkIiwgJm4sICZtKTsKCglmb3IoaW50IGk9MDsgaTxuOyBpKyspIHsKCQlmb3IoaW50IGo9MDsgajxtOyBqKyspIHsKCQkJY2luID4+IGdyYXBoW2ldW2pdOwoKCQkJaWYoZ3JhcGhbaV1bal09PSdTJykgewoJCQkJc3g9aTsgc3k9ajsKCQkJfQoJCX0KCX0KCglpZihiZnMoKSkgeXVwOwoJZWxzZSBub3BlOwp9CgppbnQgbWFpbigpIHsKCWZhc3QoKTsKCglpbnQgdD0xOwoJLy9jaW4gPj4gdDsKCXdoaWxlKHQtLSkKCXNvbHZlKCk7CgoKCXJldHVybiAwOwp9Cg==