#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-10;
const double PI = acos(-1.0);
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) {}
};
Point operator+(Point A, Point B) { return Point(A.x + B.x, A.y + B.y); }
Point operator-(Point A, Point B) { return Point(A.x - B.x, A.y - B.y); }
Point operator*(Point A, double p) { return Point(A.x * p, A.y * p); }
Point operator/(Point A, double p) { return Point(A.x / p, A.y / p); }
bool operator==(const Point& A, const Point& B) {
  return dcmp(A.x - B.x) == 0 && dcmp(A.y - B.y) == 0;
}
bool operator<(const Point& A, const Point& B) {
  return A.x < B.x || (A.x == B.x && A.y < B.y);
}
double Dist(Point A, Point B) {
  return sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y));
}
double Dot(Point A, Point B) { return A.x * B.x + A.y * B.y; }
double Cross(Point A, Point B) { return A.x * B.y - A.y * B.x; }
double Length(Point A) { return sqrt(Dot(A, A)); }
double Angle(Point A, Point B) {
  return acos(Dot(A, B) / Length(A) / Length(B));
}
double Angle(Point A) { return atan2(A.y, A.x); }
double Area(Point A, Point B, Point C) { return fabs(Cross(B - A, C - A)) / 2; }
Point TwoLinePoint(Point P, Point v, Point Q, Point w) {
  Point u = P - Q;
  double t = Cross(w, u) / Cross(v, w);
  return P + v * t;
}
vector<Point> ConvexHull(vector<Point>& p) {
  sort(p.begin(), p.end());
  p.erase(unique(p.begin(), p.end()), p.end());
  int n = p.size();
  int m = 0;
  vector<Point> ch(n + 1);
  for (int i = 0; i < n; ++i) {
    while (m > 1 && dcmp(Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2])) <= 0)
      m--;
    ch[m++] = p[i];
  }
  int k = m;
  for (int i = n - 2; i >= 0; --i) {
    while (m > k && dcmp(Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2])) <= 0)
      m--;
    ch[m++] = p[i];
  }
  if (n > 1) m--;
  ch.resize(m);
  return ch;
}
int n;
long long S;
vector<Point> V;
int aa, bb, cc;
double Max;
Point solve(Point A, Point B, Point P) {
  Point O = (A + B) / 2;
  Point PO = O - P;
  Point BX = (P - A) * -1;
  return TwoLinePoint(P, PO, B, BX);
}
int con(double x) {
  if (x >= 0)
    return (int)(x + 0.5);
  else
    return (int)(x - 0.5);
}
int main() {
  scanf("%d %lld", &n, &S);
  for (int i = 0; i < n; ++i) {
    int a, b;
    scanf("%d %d", &a, &b);
    V.push_back(Point(a, b));
  }
  vector<Point> p = ConvexHull(V);
  int sz = p.size();
  assert(sz >= 3);
  int a = 0;
  int b = 1;
  int c = 2;
  Max = Area(p[a], p[b], p[c]);
  aa = a;
  bb = b;
  cc = c;
  while (1) {
    while (1) {
      while (Area(p[a], p[b], p[c]) <= Area(p[a], p[b], p[(c + 1) % sz]))
        c = (c + 1) % sz;
      if (Area(p[a], p[b], p[c]) <= Area(p[a], p[(b + 1) % sz], p[c])) {
        b = (b + 1) % sz;
        continue;
      } else
        break;
    }
    if (Area(p[aa], p[bb], p[cc]) <= Area(p[a], p[b], p[c])) {
      aa = a;
      bb = b;
      cc = c;
    }
    a = (a + 1) % sz;
    if (a == b) b = (b + 1) % sz;
    if (b == c) c = (c + 1) % sz;
    if (a == 0) break;
  }
  Point X1 = solve(p[aa], p[bb], p[cc]);
  Point X2 = solve(p[aa], p[cc], p[bb]);
  Point X3 = solve(p[bb], p[cc], p[aa]);
  printf("%d %d\n", con(X1.x), con(X1.y));
  printf("%d %d\n", con(X2.x), con(X2.y));
  printf("%d %d\n", con(X3.x), con(X3.y));
  return 0;
}
