#include <bits/stdc++.h>
using namespace std;
struct Point {
  int x, y;
  Point() {}
  Point(int x, int y) : x(x), y(y) {}
  double norm() { return sqrt(1LL * x * x + 1LL * y * y); }
};
Point operator+(const Point &A, const Point &B) {
  return Point(A.x + B.x, A.y + B.y);
}
Point operator-(const Point &A, const Point &B) {
  return Point(A.x - B.x, A.y - B.y);
}
bool operator<(const Point &A, const Point &B) {
  return make_pair(A.x, A.y) < make_pair(B.x, B.y);
}
double dist(const Point &A, const Point &B) {
  Point AB = B - A;
  return AB.norm();
}
int n, chN;
long long S;
Point p[5005];
long long crossProduct(Point A, Point B, Point C) {
  Point AB = B - A;
  Point AC = C - A;
  return 1LL * AB.x * AC.y - 1LL * AB.y * AC.x;
}
long long triangleArea2(Point A, Point B, Point C) {
  return abs(crossProduct(A, B, C));
}
bool Comp(Point A, Point B) {
  long long cp = crossProduct(p[1], A, B);
  return cp > 0;
}
int nextIdx(int idx) {
  if (++idx == chN) return 0;
  return idx;
}
int main() {
  scanf("%d %I64d", &n, &S);
  for (int i = 1; i <= n; ++i) scanf("%d %d", &p[i].x, &p[i].y);
  for (int i = 2; i <= n; ++i) {
    if (p[i] < p[1]) swap(p[i], p[1]);
  }
  sort(p + 2, p + n + 1, Comp);
  vector<Point> convexHull;
  convexHull.push_back(p[1]);
  for (int i = 2; i <= n; ++i) {
    Point A = p[i];
    while (1) {
      if ((int)convexHull.size() < 2) break;
      Point P1 = convexHull[(int)convexHull.size() - 2];
      Point P2 = convexHull.back();
      long long cp = crossProduct(P1, P2, A);
      if (cp <= 0)
        convexHull.pop_back();
      else
        break;
    }
    convexHull.push_back(A);
  }
  int i = 0, j = 1, k = 2;
  long long maxArea = 0;
  int idx1, idx2, idx3;
  chN = (int)convexHull.size();
  vector<Point> &ch = convexHull;
  for (i = 0; i < chN; ++i) {
    if (i == j) j = nextIdx(j);
    if (j == k) k = nextIdx(k);
    while (1) {
      long long area = triangleArea2(ch[i], ch[j], ch[k]);
      while (triangleArea2(ch[i], ch[j], ch[nextIdx(k)]) >= area) {
        k = nextIdx(k);
        area = triangleArea2(ch[i], ch[j], ch[k]);
      }
      if (area > maxArea) {
        maxArea = area;
        idx1 = i;
        idx2 = j;
        idx3 = k;
      }
      if (triangleArea2(ch[i], ch[nextIdx(j)], ch[k]) < area) break;
      j = nextIdx(j);
    }
  }
  Point P1 = ch[idx1];
  Point P2 = ch[idx2];
  Point P3 = ch[idx3];
  Point S1 = P2 + P3 - P1;
  Point S2 = P1 + P3 - P2;
  Point S3 = P1 + P2 - P3;
  printf("%d %d\n", S1.x, S1.y);
  printf("%d %d\n", S2.x, S2.y);
  printf("%d %d\n", S3.x, S3.y);
  return 0;
}
