#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 7;
const long long INFL = 1e18 + 123;
const double PI = atan2(0, -1);
mt19937 tw(960172);
long long rnd(long long x, long long y) {
  static uniform_int_distribution<long long> d;
  return d(tw) % (y - x + 1) + x;
}
struct point {
  int x, y;
  point(int _x, int _y) : x(_x), y(_y) {}
  point operator-(point other) { return point(x - other.x, y - other.y); }
  point operator+(point other) { return point(x + other.x, y + other.y); }
  bool operator<(point other) {
    return x < other.x || (x == other.x && y < other.y);
  }
};
long long cross(point p1, point p2) {
  return (long long)p1.x * p2.y - (long long)p1.y * p2.x;
}
long long scalar(point p1, point p2) {
  return (long long)p1.x * p2.x + (long long)p1.y * p2.y;
}
long long dist2(point p) { return (long long)p.x * p.x + (long long)p.y * p.y; }
vector<pair<long long, long long>> calc(int n) {
  vector<point> points;
  int mem = 0;
  for (int i = 0; i < n; ++i) {
    int x, y;
    cin >> x >> y;
    points.push_back(point(x, y));
    if (points[i] < points[mem]) {
      mem = i;
    }
  }
  point c = points[mem];
  points.erase(points.begin() + mem);
  for (auto& p : points) {
    p = p - c;
  }
  sort(points.begin(), points.end(), [&](point p1, point p2) {
    bool fl1 = p1.y > 0 || (p1.y == 0 && p1.x > 0);
    bool fl2 = p2.y > 0 || (p2.y == 0 && p2.x > 0);
    if (fl1 != fl2) {
      return fl1 < fl2;
    }
    auto tmp = cross(p1, p2);
    if (tmp != 0) {
      return tmp > 0;
    }
    return dist2(p1) < dist2(p2);
  });
  vector<point> st;
  st.push_back(point(0, 0));
  points.push_back(point(0, 0));
  for (auto p : points) {
    while (((int)(st).size()) > 1) {
      long long cr =
          cross(st.back() - st[((int)(st).size()) - 2], p - st.back());
      long long sc =
          scalar(st.back() - st[((int)(st).size()) - 2], p - st.back());
      if (cr < 0 || (cr == 0 && sc > 0)) {
        st.pop_back();
      } else {
        break;
      }
    }
    st.push_back(p);
  }
  st.pop_back();
  vector<pair<long long, long long>> ret;
  for (int i = 0; i < ((int)(st).size()); ++i) {
    int next = (i + 1) % ((int)(st).size());
    int next2 = (i + 2) % ((int)(st).size());
    ret.push_back({dist2(st[next] - st[i]),
                   scalar(st[next] - st[i], st[next2] - st[next])});
  }
  return ret;
}
void solve() {
  int n, m;
  cin >> n >> m;
  auto val1 = calc(n);
  auto val2 = calc(m);
  if (((int)(val1).size()) != ((int)(val2).size())) {
    cout << "NO\n";
    return;
  }
  auto s = val1;
  for (int i = 0; i < 2; ++i) {
    for (auto p : val2) {
      s.push_back(p);
    }
  }
  vector<int> z(((int)(s).size()));
  int l = 0, r = 0;
  for (int i = 1; i < ((int)(s).size()); ++i) {
    if (i < r) {
      z[i] = min(r - i, z[i - l]);
    }
    while (i + z[i] < ((int)(s).size()) && s[z[i]] == s[i + z[i]]) {
      ++z[i];
    }
    if (i >= ((int)(val1).size())) {
      if (z[i] >= ((int)(val1).size())) {
        cout << "YES\n";
        return;
      }
    }
    if (i + z[i] > r) {
      l = i;
      r = i + z[i];
    }
  }
  cout << "NO\n";
}
int main() {
  cerr << fixed << setprecision(15);
  cout << fixed << setprecision(15);
  ios::sync_with_stdio(false);
  int tests = 1;
  for (int it = 1; it <= tests; ++it) {
    solve();
  }
  return 0;
}
