#include <bits/stdc++.h>   using namespace std;   const int maxn = 10000;   vector<int> nei[maxn];   bool mark[maxn];   vector<int> nei2[maxn];   bool markk[maxn];   int n, m, comp = 0, comp2 = 0;   void dfs(int v) {     mark[v] = true;     for (int i = 0; i < nei[v].size(); i++) {       int u = nei[v][i];       if (!mark[u]) dfs(u);     }     return;   }   bool dfs_all() {     for (int d = 0; d < n * m; d++) {       if (!mark[d]) {         dfs(d);         comp++;       }     }     if (comp == 1)       return true;     else       return false;   }   void dfs2(int v) {     markk[v] = true;     for (int p = 0; p < nei2[v].size(); p++) {       int u = nei2[v][p];       if (!markk[u]) {         dfs2(u);       }     }     return;   }   bool dfs2_all() {     for (int j = 0; j < n * m; j++) {       if (!markk[j]) {         dfs2(j);         comp2++;       }     }     if (comp2 == 1)       return true;     else       return false;   }   int main() {     string hor, ver;     cin >> n >> m;     cin >> hor >> ver;     for (int j = 0; j < n; j++) {       if (hor[j] ==  > ) {         for (int p = j * m; p < j * m + m - 1; p++) {           nei[p].push_back(p + 1);           nei2[p + 1].push_back(p);         }       } else {         for (int p = j * m + m - 1; p > j * m; p--) {           nei[p].push_back(p - 1);           nei2[p - 1].push_back(p);         }       }     }     for (int j = 0; j < m; j++) {       if (ver[j] ==  v ) {         for (int p = j; p < (n - 1) * m + j; p += m) {           nei[p].push_back(p + m);           nei2[p + m].push_back(p);         }       } else {         for (int p = (n - 1) * m + j; p > j; p -= m) {           nei[p].push_back(p - m);           nei2[p - m].push_back(p);         }       }     }     if (dfs_all() && dfs2_all())       cout <<  YES   << endl;     else       cout <<  NO  << endl;     return 0;   }   