#include <bits/stdc++.h>
using namespace std;
char CD[10];
char BD[10];
int a[3];
int getint(char *A, int s, int e) { return (A[s] - '0') * 10 + A[s + 1] - '0'; }
bool ok(int d, int m, int y) {
  if (m > 12) return 0;
  if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {
    if (d > 31) return 0;
  } else {
    if (m == 2 && y % 4 == 0)
      if (d > 29) return 0;
    if (m == 2 && y % 4 != 0)
      if (d > 28) return 0;
    if (m != 2 && d > 30) return 0;
  }
  return 1;
}
bool islesseq(int d, int m, int y, int dr, int mr, int yr) {
  if (!ok(d, m, y)) return 0;
  if (y < yr) return 1;
  if (y == yr) {
    if (m < mr) return 1;
    if (m == mr && d <= dr) return 1;
  }
  return 0;
}
string solve(int d, int m, int y) {
  if (y <= 18) return "NO";
  int yreqd = y - 18;
  int mreqd = m;
  int dreqd = d;
  if (yreqd % 4 != 0 && m == 2 && d == 29) {
    mreqd = 2;
    dreqd = 28;
  }
  a[0] = getint(BD, 0, 1);
  a[1] = getint(BD, 3, 4);
  a[2] = getint(BD, 6, 7);
  if (islesseq(a[0], a[1], a[2], dreqd, mreqd, yreqd)) return "YES";
  if (islesseq(a[0], a[2], a[1], dreqd, mreqd, yreqd)) return "YES";
  if (islesseq(a[1], a[0], a[2], dreqd, mreqd, yreqd)) return "YES";
  if (islesseq(a[1], a[2], a[0], dreqd, mreqd, yreqd)) return "YES";
  if (islesseq(a[2], a[0], a[1], dreqd, mreqd, yreqd)) return "YES";
  if (islesseq(a[2], a[1], a[0], dreqd, mreqd, yreqd)) return "YES";
  return "NO";
}
int main() {
  scanf("%s", &CD);
  scanf("%s", &BD);
  int d = getint(CD, 0, 1);
  int m = getint(CD, 3, 4);
  int y = getint(CD, 6, 7);
  cout << solve(d, m, y) << endl;
}
