#include <bits/stdc++.h>
using namespace std;
int long long n, m, i, j, k, k1, d[1005][1005], INF = 1e9 + 9;
char c[1005][1005];
bool used[1005][1005];
void dfs(int x, int y, int ans, int l) {
  if (ans > 3) return;
  if (c[x][y] == 'T') {
    cout << "YES";
    exit(0);
  }
  used[x][y] = true;
  if (y < m && used[x][y + 1] == false && l != 2 &&
      (c[x][y + 1] == '.' || c[x][y + 1] == 'T')) {
    if (l != 1) {
      if (d[x][y] + 1 < d[x][y + 1]) {
        d[x][y + 1] = d[x][y] + 1;
        dfs(x, y + 1, ans + 1, 1);
      }
    } else {
      d[x][y + 1] = d[x][y];
      dfs(x, y + 1, ans, 1);
    }
  }
  if (y > 1 && used[x][y - 1] == false && l != 1 &&
      (c[x][y - 1] == '.' || c[x][y - 1] == 'T')) {
    if (l != 2) {
      if (d[x][y] + 1 < d[x][y - 1]) {
        d[x][y - 1] = d[x][y] + 1;
        dfs(x, y - 1, ans + 1, 2);
      }
    } else {
      d[x][y - 1] = d[x][y];
      dfs(x, y - 1, ans, 2);
    }
  }
  if (x < n && used[x + 1][y] == false && l != 4 &&
      (c[x + 1][y] == 'T' || c[x + 1][y] == '.')) {
    if (l != 3) {
      if (d[x][y] + 1 < d[x + 1][y]) {
        d[x + 1][y] = d[x][y] + 1;
        dfs(x + 1, y, ans + 1, 3);
      }
    } else {
      d[x + 1][y] = d[x][y];
      dfs(x + 1, y, ans, 3);
    }
  }
  if (x > 1 && used[x - 1][y] == false && l != 3 &&
      (c[x - 1][y] == 'T' || c[x - 1][y] == '.')) {
    if (l != 4) {
      if (d[x][y] + 1 < d[x - 1][y]) {
        d[x - 1][y] = d[x][y] + 1;
        dfs(x - 1, y, ans + 1, 4);
      }
    } else {
      d[x - 1][y] = d[x][y];
      dfs(x - 1, y, ans, 4);
    }
  }
  used[x][y] = false;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n >> m;
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= m; j++) {
      d[i][j] = INF;
      cin >> c[i][j];
      if (c[i][j] == 'S') {
        k = i;
        k1 = j;
      }
    }
  }
  d[k][k1] = 0;
  dfs(k, k1, 0, 0);
  cout << "NO";
}
