#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
template <class T, class U>
inline T tmin(T a, U b) {
  return (a < b) ? a : b;
}
template <class T, class U>
inline T tmax(T a, U b) {
  return (a > b) ? a : b;
}
template <class T, class U>
inline void amax(T &a, T b) {
  if (b > a) a = b;
}
template <class T, class U>
inline void amin(T &a, T b) {
  if (b < a) a = b;
}
template <class T>
inline T tabs(T a) {
  return (a > 0) ? a : -a;
}
template <class T>
T gcd(T a, T b) {
  while (b != 0) {
    T c = a;
    a = b;
    b = c % b;
  }
  return a;
}
map<vector<string>, int> mp;
void dfs(string x, string y) {
  vector<string> tmp;
  tmp.push_back(x);
  tmp.push_back(y);
  if (mp.count(tmp) == 0) {
    mp[tmp] = 1;
  } else
    return;
  if (x[0] == 'X' || y[0] == 'X') {
    swap(x[0], y[0]);
    dfs(x, y);
    swap(x[0], y[0]);
  }
  if (x[1] == 'X' || y[1] == 'X') {
    swap(x[1], y[1]);
    dfs(x, y);
    swap(x[1], y[1]);
  }
  if (x[0] == 'X' || x[1] == 'X') {
    swap(x[0], x[1]);
    dfs(x, y);
    swap(x[0], x[1]);
  }
  if (y[0] == 'X' || y[1] == 'X') {
    swap(y[0], y[1]);
    dfs(x, y);
    swap(y[0], y[1]);
  }
}
int main(int argc, char *argv[]) {
  ios_base::sync_with_stdio(false);
  string s[2], t[2];
  cin >> s[0] >> s[1];
  cin >> t[0] >> t[1];
  dfs(s[0], s[1]);
  vector<string> ans;
  ans.push_back(t[0]);
  ans.push_back(t[1]);
  if (mp.count(ans) > 0)
    puts("YES");
  else
    puts("NO");
  return 0;
}
