#include <bits/stdc++.h>
using namespace std;
struct Pt {
  long long x, y;
  Pt() {}
  Pt(long long _x, long long _y) : x(_x), y(_y) {}
  Pt operator+(const Pt &p) const { return Pt(x + p.x, y + p.y); }
  Pt operator-(const Pt &p) const { return Pt(x - p.x, y - p.y); }
  Pt operator*(long long c) const { return Pt(x * c, y * c); }
  Pt operator/(long long c) const { return Pt(x / c, y / c); }
  long long abs2() { return x * x + y * y; }
};
inline long long dist2(Pt a, Pt b) {
  long long dx = a.x - b.x;
  long long dy = a.y - b.y;
  return dx * dx + dy * dy;
}
inline long long cross(Pt a, Pt b) { return a.x * b.y - a.y * b.x; }
long long dot(Pt a, Pt b) { return a.x * b.x + a.y * b.y; }
inline int ccw(Pt p, Pt q, Pt r) {
  long long v = cross(p - q, p - r);
  if (v < 0) return -1;
  if (v > 0) return 1;
  return 0;
}
vector<Pt> convexHull(vector<Pt> &P) {
  sort(P.begin(), P.end(), [](const Pt &a, const Pt &b) {
    if (a.x != b.x) return a.x < b.x;
    return a.y < b.y;
  });
  vector<Pt> up, dn, hull;
  for (int i = 0; i < P.size(); ++i) {
    while (up.size() > 1 && ccw(up[up.size() - 2], up.back(), P[i]) >= 0)
      up.pop_back();
    while (dn.size() > 1 && ccw(dn[dn.size() - 2], dn.back(), P[i]) <= 0)
      dn.pop_back();
    up.push_back(P[i]);
    dn.push_back(P[i]);
  }
  hull = up;
  for (int i = (int)dn.size() - 2; i > 0; --i) hull.push_back(dn[i]);
  reverse(hull.begin(), hull.end());
  return hull;
}
vector<long long> getdata(int n) {
  vector<Pt> A(n);
  for (int i = 0; i < n; ++i) {
    scanf("%lld%lld", &A[i].x, &A[i].y);
  }
  A = convexHull(A);
  if (A.size() == 2) return {(A[1] - A[0]).abs2()};
  n = A.size();
  vector<long long> data;
  for (int i = 0; i < n; ++i) {
    int a = (i + n - 1) % n, b = (i + 1) % n;
    Pt aa = A[a] - A[i], bb = A[b] - A[i];
    long long ang = dot(aa, bb);
    data.push_back(aa.abs2());
    data.push_back((1LL << 60) + ang);
  }
  return data;
}
void no() {
  printf("NO\n");
  exit(0);
}
void yes() {
  printf("YES\n");
  exit(0);
}
vector<int> zalgo(vector<long long> S) {
  int n = S.size(), l = 0, r = 0;
  vector<int> Z(n);
  Z[0] = n;
  for (int i = 1; i < n; ++i) {
    if (i > r) {
      l = r = i;
      while (r < n && S[r - l] == S[r]) ++r;
      Z[i] = r - l;
      --r;
    } else {
      if (Z[i - l] <= r - i)
        Z[i] = Z[i - l];
      else {
        l = i;
        while (r < n && S[r - l] == S[r]) ++r;
        Z[i] = r - l;
        --r;
      }
    }
  }
  return Z;
}
bool roteq(vector<long long> a, vector<long long> b) {
  if (a.size() != b.size()) return false;
  vector<long long> s = a;
  s.insert(s.end(), b.begin(), b.end());
  s.insert(s.end(), b.begin(), b.end());
  auto z = zalgo(s);
  for (int i = a.size(); i < s.size(); ++i) {
    if (z[i] >= a.size()) return true;
  }
  return false;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  auto a = getdata(n);
  auto b = getdata(m);
  if (a.size() > b.size()) swap(a, b);
  if (a.size() == 1) {
    if (b.size() > 1) no();
    if (a[0] != b[0]) no();
    yes();
  }
  if (roteq(a, b))
    yes();
  else
    no();
}
