#include <bits/stdc++.h>
using namespace std;
struct Point {
  int x, y;
  Point() {}
  Point(int _x, int _y) : x(_x), y(_y) {}
  bool operator<(const Point &that) const {
    return (x < that.x || (x == that.x && y < that.y));
  }
  Point operator+(const Point &that) const {
    return (Point(x + that.x, y + that.y));
  }
  Point operator-(const Point &that) const {
    return (Point(x - that.x, y - that.y));
  }
};
long long Cross(Point O, Point A, Point B) {
  return 1ll * (A.x - O.x) * (B.y - O.y) - 1ll * (A.y - O.y) * (B.x - O.x);
}
vector<Point> Convex_hull(vector<Point> P) {
  int n = P.size(), k = 0;
  sort(P.begin(), P.end());
  vector<Point> H(2 * n);
  for (int i = 0; i < n; ++i) {
    while (k >= 2 && Cross(H[k - 2], H[k - 1], P[i]) <= 0) k--;
    H[k++] = P[i];
  }
  int t = k + 1;
  for (int i = n - 2; i >= 0; --i) {
    while (k >= t && Cross(H[k - 2], H[k - 1], P[i]) <= 0) k--;
    H[k++] = P[i];
  }
  H.resize(k - 1);
  return H;
}
vector<Point> V;
int n;
long long s;
int main() {
  scanf("%d%I64d", &n, &s);
  for (int i = 1; i <= n; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    V.push_back(Point(x, y));
  }
  V = Convex_hull(V);
  int n = V.size();
  int A = 0, B = 1, C = 2, AA = 0, BB = 1, CC = 2;
  while (1) {
    while (1) {
      while (Cross(V[A], V[B], V[C]) <= Cross(V[A], V[B], V[(C + 1) % n]))
        C = (C + 1) % n;
      if (Cross(V[A], V[B], V[C]) <= Cross(V[A], V[(B + 1) % n], V[C])) {
        B = (B + 1) % n;
        continue;
      } else
        break;
    }
    if (Cross(V[A], V[B], V[C]) > Cross(V[AA], V[BB], V[CC]))
      AA = A, BB = B, CC = C;
    A = (A + 1) % n;
    if (A == B) B = (B + 1) % n;
    if (B == C) C = (C + 1) % n;
    if (!A) break;
  }
  Point T1 = V[AA] + V[BB] - V[CC];
  Point T2 = V[AA] - V[BB] + V[CC];
  Point T3 = V[BB] - V[AA] + V[CC];
  printf("%d %d\n", T1.x, T1.y);
  printf("%d %d\n", T2.x, T2.y);
  printf("%d %d\n", T3.x, T3.y);
}
