#include <bits/stdc++.h>
using namespace std;
struct IO {
  streambuf *ib, *ob;
  inline void init() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    ib = cin.rdbuf();
    ob = cout.rdbuf();
  }
  inline long long read() {
    char ch = ib->sbumpc();
    int i = 0, f = 1;
    while (!isdigit(ch)) {
      if (ch == '-') f = -1;
      ch = ib->sbumpc();
    }
    while (isdigit(ch)) {
      i = (i + (i << 2) << 1) + ch - '0';
      ch = ib->sbumpc();
    }
    return i * f;
  }
  inline void W(long long x) {
    static int buf[50];
    if (!x) {
      ob->sputc('0');
      ob->sputc('\n');
      return;
    }
    if (x < 0) {
      ob->sputc('-');
      x = -x;
    }
    while (x) {
      buf[++buf[0]] = x % 10;
      x /= 10;
    }
    while (buf[0]) ob->sputc(buf[buf[0]--] + '0');
    ob->sputc('\n');
  }
} io;
const int Maxn = 5e3 + 50;
int n, id, A, B, C;
long long maxarea;
struct point {
  long long x, y;
  point(long long x = 0, long long y = 0) : x(x), y(y) {}
  friend inline point operator-(const point &a, const point &b) {
    return point(a.x - b.x, a.y - b.y);
  }
  friend inline long long operator*(const point &a, const point &b) {
    return a.x * b.y - a.y * b.x;
  }
  inline long long norm(point x) {
    return (x - x.x) * (x - x.x) + (y - x.y) * (y - x.y);
  }
} p[Maxn];
inline bool operator<(point a, point b) {
  long long t = (a - p[1]) * (b - p[1]);
  return t > 0 || (t == 0 && a.norm(p[1]) <= b.norm(p[1]));
}
int tot;
inline int nxt(int i) { return (i + 1 > tot) ? i + 1 - tot : i + 1; }
inline long long calcarea(int a, int b, int c) {
  return abs((p[b] - p[a]) * (p[c] - p[a]));
}
int main() {
  io.init();
  n = io.read();
  long long s = io.read();
  for (int i = 1; i <= n; i++) {
    p[i].x = io.read(), p[i].y = io.read();
    if (i == 1 || p[i].x < p[id].x || (p[i].x == p[id].x && p[i].y < p[id].y))
      id = i;
  }
  if (n <= 3) {
    cout << p[1].x << " " << p[1].y << endl;
    cout << p[2].x << " " << p[2].y << endl;
    cout << p[3].x << " " << p[3].y << endl;
    return 0;
  }
  if (id != 1) swap(p[id], p[1]);
  sort(p + 2, p + n + 1);
  tot = 1;
  for (int i = 2; i <= n; i++) {
    while (tot >= 2 && (p[i] - p[tot - 1]) * (p[tot] - p[tot - 1]) >= 0) tot--;
    p[++tot] = p[i];
  }
  for (int i = 1, t = nxt(i); i <= tot; i++, t = nxt(i)) {
    for (int j = nxt(i); nxt(j) != i; j = nxt(j)) {
      if (t == j) t = nxt(j);
      if (t == i) break;
      while (nxt(t) != i && calcarea(i, j, t) <= calcarea(i, j, nxt(t)))
        t = nxt(t);
      if (calcarea(i, j, t) >= maxarea)
        maxarea = calcarea(i, j, t), A = i, B = j, C = t;
    }
  }
  cout << p[B].x + p[C].x - p[A].x << " " << p[B].y + p[C].y - p[A].y << endl;
  cout << p[A].x + p[C].x - p[B].x << " " << p[A].y + p[C].y - p[B].y << endl;
  cout << p[A].x + p[B].x - p[C].x << " " << p[A].y + p[B].y - p[C].y << endl;
}
