#include <bits/stdc++.h>
using namespace std;
const long long N = 300010;
const double pi = 4 * atan(1);
const double eps = 1e-6;
inline int dcmp(double x) {
  if (fabs(x) < eps)
    return 0;
  else
    return x < 0 ? -1 : 1;
}
struct point {
  double x, y;
  point(double x = 0, double y = 0) : x(x), y(y) {}
  void read() { scanf("%lf%lf", &x, &y); }
  void write() { printf("%lf %lf", x, y); }
  void put(double a, double b) { x = a, y = b; }
  bool operator==(const point& u) const {
    return dcmp(x - u.x) == 0 && dcmp(y - u.y) == 0;
  }
  bool operator!=(const point& u) const { return !(*this == u); }
  bool operator<(const point& u) const {
    return dcmp(x - u.x) < 0 || (dcmp(x - u.x) == 0 && dcmp(y - u.y) < 0);
  }
  bool operator>(const point& u) const { return u < *this; }
  bool operator<=(const point& u) const { return *this < u || *this == u; }
  bool operator>=(const point& u) const { return *this > u || *this == u; }
  point operator+(const point& u) { return point(x + u.x, y + u.y); }
  point operator-(const point& u) { return point(x - u.x, y - u.y); }
  point operator*(const double u) { return point(x * u, y * u); }
  point operator/(const double u) { return point(x / u, y / u); }
  double operator*(const point& u) { return x * u.y - y * u.x; }
};
namespace Vectorial {
double getDot(point a, point b) { return a.x * b.x + a.y * b.y; }
double getCross(point a, point b) { return a.x * b.y - a.y * b.x; }
double getLength(point a) { return sqrt(getDot(a, a)); }
double angle(point a, point b) {
  double ret = getDot(a, b);
  ret /= (getLength(a) * getLength(b));
  ret = acos(max(-1.0, min(1.0, ret)));
  return (ret * 180) / pi;
}
};  // namespace Vectorial
struct Segment {
  point a;
  point b;
  Segment() {}
  Segment(point aa, point bb) { a = aa, b = bb; }
};
namespace Linear {
using namespace Vectorial;
bool onSegment(point p, point a, point b) {
  return dcmp(getCross(a - p, b - p)) == 0 && dcmp(getDot(a - p, b - p)) <= 0;
}
double getDistanceToLine(point p, point a, point b) {
  return fabs(getCross(b - a, p - a) / getLength(b - a));
}
bool LinesParallel(point a, point b, point c, point d) {
  return fabs(getCross(b - a, c - d)) < eps;
}
bool LinesCollinear(point a, point b, point c, point d) {
  return LinesParallel(a, b, c, d) && fabs(getCross(a - b, a - c)) < eps &&
         fabs(getCross(c - d, c - a)) < eps;
}
bool SegmentsIntersect(point a, point b, point c, point d) {
  if (LinesCollinear(a, b, c, d)) {
    if (getLength(c - a) < eps || getLength(d - a) < eps ||
        getLength(c - b) < eps || getLength(d - b) < eps)
      return true;
    if (getDot(c - a, c - b) > 0 && getDot(d - a, d - b) > 0 &&
        getDot(c - b, d - b) > 0)
      return false;
    return true;
  }
  if (getCross(d - a, b - a) * getCross(c - a, b - a) > 0) return false;
  if (getCross(a - c, d - c) * getCross(b - c, d - c) > 0) return false;
  return true;
}
}  // namespace Linear
using namespace Linear;
point a[N], b[N];
long long n, m;
vector<int> v;
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    a[i].read();
  }
  for (int i = 0; i < m; i++) {
    b[i].read();
    v.push_back(i);
  }
  if (n != m) {
    cout << "No"
         << "\n";
    return 0;
  }
  do {
    bool imp = 0;
    for (int i = 0; i < n; i++) {
      point x = a[i], y = b[v[i]];
      for (int j = 0; j < i; j++) {
        point p = a[j], q = b[v[j]];
        if (SegmentsIntersect(x, y, p, q)) {
          imp = 1;
          break;
        }
      }
      if (imp) break;
    }
    if (!imp) {
      cout << "Yes"
           << "\n";
      return 0;
    }
  } while (next_permutation(v.begin(), v.end()));
  cout << "No"
       << "\n";
  return 0;
}
