#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
const int kMaxN = 5500;
bool dcmp(double x) { return fabs(x) < eps; }
struct Point {
  double x, y;
  Point() {}
  Point(double _x, double _y) : x(_x), y(_y) {}
  Point operator+(const Point& b) const { return Point(x + b.x, y + b.y); }
  Point operator-(const Point& b) const { return Point(x - b.x, y - b.y); }
  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); }
  bool operator<(const Point& b) const {
    if (dcmp(x - b.x)) return y < b.y;
    return x < b.x;
  }
} p[kMaxN], stk[kMaxN];
bool cmp(Point a, Point b) {
  a = a - p[0], b = b - p[0];
  return dcmp(a * b) == 0 ? a * b > 0 : (a ^ a) < (b ^ b);
}
int Graham(int n) {
  sort(p, p + n);
  sort(p + 1, p + n, cmp);
  int top = 0;
  for (int i = 0; i < n; i++) {
    while (top > 1 &&
           (p[i] - stk[top - 1]) * (stk[top - 1] - stk[top - 2]) >= 0)
      top--;
    stk[top++] = p[i];
  }
  return top;
}
int main() {
  int n;
  long long s;
  scanf("%d%I64d", &n, &s);
  for (int i = 0; i < n; i++) scanf("%lf%lf", &p[i].x, &p[i].y);
  int sz = Graham(n);
  vector<int> res(3);
  double ans = 0;
  for (int i = 0; i < sz; i++) {
    int k;
    for (int j = (i + 1) % sz, k = j; j != i; j = (j + 1) % sz) {
      while ((stk[i] - stk[k]) * (stk[j] - stk[k]) <
             (stk[i] - stk[(k + 1) % sz]) * (stk[j] - stk[(k + 1) % sz]))
        k = (k + 1) % sz;
      if (ans < (stk[i] - stk[k]) * (stk[j] - stk[k]))
        ans = (stk[i] - stk[k]) * (stk[j] - stk[k]), res = {i, j, k};
    }
  }
  for (int i = 0; i < 3; i++) {
    Point t = stk[res[i]] + stk[res[(i + 1) % 3]] - stk[res[(i + 2) % 3]];
    printf("%d %d\n", (int)t.x, (int)t.y);
  }
  return 0;
}
