#include <bits/stdc++.h>
using namespace std;
struct point {
  double x, y;
};
struct triangle {
  point a, b, c;
  void mp(point i, point j, point k) {
    a = i;
    b = j;
    c = k;
  }
  void print() {
    printf("%.0f %.0f\n", a.x + b.x - c.x, a.y + b.y - c.y);
    printf("%.0f %.0f\n", a.x + c.x - b.x, a.y + c.y - b.y);
    printf("%.0f %.0f\n", b.x + c.x - a.x, b.y + c.y - a.y);
  }
};
point a[5010], MIN, b[5010];
int top;
inline double AXB(point c, point a, point b) {
  return (c.x - a.x) * (c.y - b.y) - (c.y - a.y) * (c.x - b.x);
}
inline double dis(point a, point b) {
  return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
bool cmp(point a, point b) {
  double k = AXB(MIN, a, b);
  if (k < 0) return 1;
  if (k > 0) return 0;
  return dis(MIN, a) > dis(MIN, b);
}
void scan(point *a, int n) {
  for (int i = 1; i < n; i++) {
    if (a[i].y < a[0].y || (a[i].y == a[0].y && a[i].x < a[0].x))
      swap(a[i], a[0]);
  }
  MIN = a[0];
  sort(a + 1, a + n, cmp);
  top = 0;
  b[top++] = a[0];
  b[top++] = a[1];
  b[top++] = a[2];
  for (int i = 3; i < n; i++) {
    while (AXB(b[top - 2], b[top - 1], a[i]) > 0 && top >= 2) top--;
    b[top++] = a[i];
  }
}
void qurry(point *a, int n) {
  triangle T, temp;
  double ans = 0, Max;
  a[n] = a[0];
  for (int i = 0; i < n; i++) {
    int k = (i + 2) % n;
    for (int j = i + 1; j < n; j++) {
      temp.mp(b[i], b[j], b[k]);
      while (AXB(b[i], b[k + 1], b[j]) > (Max = AXB(b[i], b[k], b[j]))) {
        k = (k + 1) % n;
        temp.mp(b[i], b[j], b[k]);
      }
      if (Max > ans) {
        T = temp;
        ans = Max;
      }
    }
  }
  T.print();
}
int main() {
  int n, S;
  scanf("%d %d", &n, &S);
  for (int i = 0; i < n; i++) scanf("%lf %lf", &a[i].x, &a[i].y);
  scan(a, n);
  qurry(b, top);
  return 0;
}
