#include <bits/stdc++.h>
using namespace std;
inline long long in() {
  int32_t x;
  scanf("%d", &x);
  return x;
}
inline string getStr() {
  char ch[1000000];
  scanf("%s", ch);
  return ch;
}
template <class P, class Q>
inline P smin(P &a, Q b) {
  if (b < a) a = b;
  return a;
}
template <class P, class Q>
inline P smax(P &a, Q b) {
  if (a < b) a = b;
  return a;
}
const long long MAX_N = 2e5 + 10;
const long long MOD = 1e9 + 7;
inline long long gcd(long long a, long long b) {
  return b == 0 ? a : gcd(b, a % b);
}
inline char getCh() {
  char ch;
  scanf(" %c", &ch);
  return ch;
}
long long inp[2][2][3];
bool mark[27][27][27][27];
inline void dfs() {
  if (mark[inp[0][0][2]][inp[0][0][2]][inp[1][0][2]][inp[1][1][2]]) {
    return;
  }
  if (inp[0][0][2] == inp[0][0][1] && inp[0][1][2] == inp[0][1][1] &&
      inp[1][0][2] == inp[1][0][1] && inp[1][1][2] == inp[1][1][1]) {
    cout << "YES\n";
    exit(0);
  }
  mark[inp[0][0][2]][inp[0][0][2]][inp[1][0][2]][inp[1][1][2]] = true;
  if (inp[0][0][2] == 23) {
    swap(inp[0][0][2], inp[0][1][2]);
    dfs();
  } else if (inp[0][1][2] == 23) {
    swap(inp[0][1][2], inp[1][1][2]);
    dfs();
  } else if (inp[1][1][2] == 23) {
    swap(inp[1][1][2], inp[1][0][2]);
    dfs();
  } else {
    swap(inp[1][0][2], inp[0][0][2]);
    dfs();
  }
}
int32_t main() {
  for (long long i = 0; i < 2; i++) {
    for (long long r = 0; r < 2; r++) {
      for (long long c = 0; c < 2; c++) {
        inp[r][c][i] = (getCh() - 'A');
        inp[r][c][2] = inp[r][c][0];
      }
    }
  }
  dfs();
  cout << "NO\n";
}
