#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#include<list>
#include<stack>
#include<cstdio>
#include<fstream>
#include<numeric>
#include<functional>
#include<utility>
#include<memory>
using namespace std;
using namespace placeholders;
int n, m;
int step[1005][1005][5];
int dx[] = { 0, 0, 1, 0, -1 };
int dy[] = { 0, -1, 0, 1, 0 };
int area[1005][1005];
int startX, startY;
int endX, endY;
void dfs(int curX, int curY, int direction, int num){
if (num > 2) return;
if (area[curX][curY] == 1) return;
if (step[curX][curY][direction] != -1 && step[curX][curY][direction] <= num) return;
step[curX][curY][direction] = num;
for (int i = 1; i < 5; i++){
int init = direction - 2;
if (init < 1) init += 4;
if (direction != 0 && i == init) continue;
if (direction == 0) dfs(curX + dx[i], curY + dy[i], i, num);
else{
if (direction == i) dfs(curX + dx[i], curY + dy[i], i, num);
else dfs(curX + dx[i], curY + dy[i], i, num + 1);
}
}
}
int main(){
while (cin >> n >> m){
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
char t;
cin >> t;
if (t == '*') area[i][j] = 1;
else area[i][j] = 0;
if (t == 'S'){
startX = i;
startY = j;
}
if (t == 'T'){
endX = i;
endY = j;
}
for (int tt = 0; tt <= 4; tt++) step[i][j][tt] = -1;
}
}
dfs(startX, startY, 0, 0);
int i;
for (i = 1; i <= 4; i++){
if (step[endX][endY][i] != -1){
cout << "YES" << endl;
break;
}
}
if (i > 4) cout << "NO" << endl;
}
// system("pause");
return 0;
}