#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e3 + 500;
const double eps = 1e-8;
int sgn(double x) {
  if (fabs(x) < eps) return 0;
  if (x < 0)
    return -1;
  else
    return 1;
}
struct Point {
  double x, y;
  Point() {}
  Point(double _x, double _y) : x(_x), y(_y) {}
  void input() { scanf("%lf%lf", &x, &y); }
  void output() { printf("%.0lf %.0lf\n", x, y); }
  Point operator-(const Point &b) const { return Point(x - b.x, y - b.y); }
  bool operator==(const Point &b) const {
    return sgn(x - b.x) == 0 && sgn(y - b.y) == 0;
  }
  bool operator<(const Point &b) const {
    return sgn(x - b.x) == 0 ? sgn(y - b.y) < 0 : x < b.x;
  }
  double operator^(const Point &b) const { return x * b.y - y * b.x; }
  double operator*(const Point &b) const { return x * b.x + y * b.y; }
  double distance(Point b) { return hypot(x - b.x, y - b.y); }
};
struct polygon {
  int n;
  Point p[maxn], p1, p2, p3;
  void input(int _n) {
    n = _n;
    for (int i = 0; i < n; ++i) p[i].input();
  }
  struct cmp {
    Point p;
    cmp(const Point &p0) { p = p0; }
    bool operator()(const Point &aa, const Point &bb) {
      Point a = aa, b = bb;
      int d = sgn((a - p) ^ (b - p));
      if (d == 0) return sgn(a.distance(p) - b.distance(p)) < 0;
      return d > 0;
    }
  };
  void norm() {
    Point mi = p[0];
    for (int i = 1; i < n; ++i) mi = min(mi, p[i]);
    sort(p, p + n, cmp(mi));
  }
  void Graham(polygon &convex) {
    norm();
    int &top = convex.n;
    top = 0;
    if (n == 1) {
      top = 1;
      convex.p[0] = p[0];
      return;
    }
    if (n == 2) {
      top = 2;
      convex.p[0] = p[0];
      convex.p[1] = p[1];
      if (convex.p[0] == convex.p[1]) top--;
      return;
    }
    convex.p[0] = p[0];
    convex.p[1] = p[1];
    top = 2;
    for (int i = 2; i < n; ++i) {
      while (top > 1 && sgn((convex.p[top - 1] - convex.p[top - 2]) ^
                            (p[i] - convex.p[top - 2])) <= 0)
        top--;
      convex.p[top++] = p[i];
    }
    if (convex.n == 2 && (convex.p[0] == convex.p[1])) convex.n--;
  }
  void rotating_calipers() {
    double ans = 0;
    for (int i = 0; i < n; ++i) {
      int k = i + 1;
      for (int j = i + 1; j < n; ++j) {
        while (sgn(fabs((p[j] - p[i]) ^ (p[(k + 1) % n] - p[i])) -
                   fabs((p[j] - p[i]) ^ (p[k] - p[i]))) > 0)
          k = (k + 1) % n;
        if (ans < 0.5 * fabs((p[j] - p[i]) ^ (p[k] - p[i]))) {
          p1 = p[i];
          p2 = p[j];
          p3 = p[k];
          ans = 0.5 * fabs((p[j] - p[i]) ^ (p[k] - p[i]));
        }
      }
    }
  }
} A, B;
int n;
long long s;
int main() {
  scanf("%d%lld", &n, &s);
  A.input(n);
  A.Graham(B);
  B.rotating_calipers();
  printf("%.0lf %.0lf\n", B.p1.x + B.p2.x - B.p3.x, B.p1.y + B.p2.y - B.p3.y);
  printf("%.0lf %.0lf\n", B.p1.x + B.p3.x - B.p2.x, B.p1.y + B.p3.y - B.p2.y);
  printf("%.0lf %.0lf\n", B.p3.x + B.p2.x - B.p1.x, B.p3.y + B.p2.y - B.p1.y);
  return 0;
}
