#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct Point {
  ll x, y;
};
struct Vector {
  ll dx, dy;
};
bool operator<(Point p, Point q) {
  return make_pair(p.x, p.y) < make_pair(q.x, q.y);
}
bool operator==(Point p, Point q) { return p.x == q.x && p.y == q.y; }
Point operator+(Point p, Vector v) { return {p.x + v.dx, p.y + v.dy}; }
Vector operator-(Point p, Point q) { return {p.x - q.x, p.y - q.y}; }
ll operator^(Vector v1, Vector v2) { return v1.dx * v2.dy - v1.dy * v2.dx; }
ll orientation(Point p1, Point p2, Point p3) { return (p2 - p1) ^ (p3 - p1); }
ll square_norm(Vector v) { return v.dx * v.dx + v.dy * v.dy; }
ll square_distance(Point p, Point q) { return square_norm(q - p); }
struct Triangle {
  Point a, b, c;
};
Triangle anticomplementary(Triangle t) {
  Point A = t.a + (t.b - t.c);
  Point B = t.b + (t.c - t.a);
  Point C = t.c + (t.a - t.b);
  return {A, B, C};
}
ll double_area(Triangle t) { return abs((t.b - t.a) ^ (t.c - t.a)); }
bool operator<(Triangle t1, Triangle t2) {
  return double_area(t1) < double_area(t2);
}
vector<Point> convex_hull(vector<Point> ps) {
  if ((int)ps.size() <= 1) return ps;
  int n = ps.size(), k = 0;
  sort(ps.begin(), ps.end());
  vector<Point> ch(2 * n);
  for (int i = 0; i < n; ch[k++] = ps[i++])
    while (k >= 2 && orientation(ch[k - 2], ch[k - 1], ps[i]) <= 0) --k;
  for (int i = n - 2, t = k + 1; i >= 0; ch[k++] = ps[i--])
    while (k >= t && orientation(ch[k - 2], ch[k - 1], ps[i]) <= 0) --k;
  ch.resize(k - 1);
  return ch;
}
vector<Point> maximumAreaTriangle(const vector<Point> &ch) {
  int n = (int)ch.size();
  if (n <= 2) return vector<Point>();
  int A = 0, B = 1, C = 2;
  vector<Point> res = {ch[A], ch[B], ch[C]};
  ll best = double_area({ch[A], ch[B], ch[C]}), cur = best, tmp;
  do {
    while (1) {
      while (cur <= (tmp = double_area({ch[A], ch[B], ch[(C + 1) % n]})))
        (++C) %= n, cur = tmp;
      if (cur <= (tmp = double_area({ch[A], ch[(B + 1) % n], ch[C]}))) {
        (++B) %= n, cur = tmp;
        continue;
      }
      break;
    }
    if (cur > best) {
      res[0] = ch[A], res[1] = ch[B], res[2] = ch[C];
      best = cur;
    }
    (++A) %= n;
    if (A == B) (++B) %= n;
    if (B == C) (++C) %= n;
    cur = double_area({ch[A], ch[B], ch[C]});
  } while (A != 0);
  return res;
}
int main() {
  int n;
  long long S;
  cin >> n >> S;
  vector<Point> points(n);
  for (int i = 0; i < n; i++) {
    int x;
    int y;
    scanf("%d%d", &x, &y);
    points[i] = {x, y};
  }
  vector<Point> ch = convex_hull(points);
  vector<Point> tri = maximumAreaTriangle(ch);
  Point a = tri[0] + (tri[1] - tri[2]);
  Point b = tri[0] + (tri[2] - tri[1]);
  Point c = tri[1] + (tri[2] - tri[0]);
  cout << a.x << " " << a.y << endl;
  cout << b.x << " " << b.y << endl;
  cout << c.x << " " << c.y << endl;
  return 0;
}
