#include <bits/stdc++.h>
using namespace std;
const double Pi = acos(-1);
int n;
struct Point {
  long long x, y;
  Point(long long x = 0, long long y = 0) : x(x), y(y) {}
  void input() { scanf("%I64d%I64d", &x, &y); }
  void print() { printf("%I64d %I64d ", 1000 - y * 3 - 400, x * 3 + 400); }
} node[5010], A, B, C;
int fcmp(double a, double b = 0) {
  return fabs(a - b) < 1e-9 ? 0 : a < b ? -1 : 1;
}
bool operator<(const Point &a, const Point &b) {
  return a.x == b.x ? a.y < b.y : a.x < b.x;
}
bool operator==(const Point &a, const Point &b) {
  return fcmp(a.x, b.x) == 0 && fcmp(a.y, b.y) == 0;
}
Point operator+(const Point &a, const Point &b) {
  return Point(a.x + b.x, a.y + b.y);
}
Point operator-(const Point &a, const Point &b) {
  return Point(a.x - b.x, a.y - b.y);
}
long long Dot(const Point &a, const Point &b) { return a.x * b.x + a.y * b.y; }
long long Cross(const Point &a, const Point &b) {
  return a.x * b.y - a.y * b.x;
}
double Length(const Point &a) { return sqrt(Dot(a, a)); }
double Angle(const Point &a) { return atan2(a.y, a.x); }
double Angle(const Point &a, const Point &b) {
  double ans = Dot(a, b) / Length(a) / Length(b);
  if (fcmp(ans, 1) == 0) return acos(1);
  if (fcmp(ans, -1) == 0) return acos(-1);
  return acos(ans);
}
struct Line {
  Point node, line;
  Line(const Point &node, const Point &line) : node(node), line(line) {}
};
Point Rotate(const Point &a, double rad) {
  return Point(a.x * cos(rad) - a.y * sin(rad),
               a.x * sin(rad) + a.y * cos(rad));
}
void read() {
  int ls1;
  scanf("%d%d", &n, &ls1);
  for (int i = 1; i <= n; ++i) node[i].input();
  return;
}
double get_Point_Line_Length(const Point &a, const Line &b) {
  return fabs(Cross(b.line, a - b.node) / Length(b.line));
}
deque<Point> Andrew(int n, Point *node) {
  sort(node + 1, node + 1 + n);
  n = unique(node + 1, node + 1 + n) - node - 1;
  deque<Point> ans;
  for (int i = 1; i <= n; ++i) {
    while (ans.size() > 1 &&
           Cross(ans.back() - *(ans.end() - 2), node[i] - *(ans.end() - 2)) < 0)
      ans.pop_back();
    ans.push_back(node[i]);
  }
  int now = ans.size();
  for (int i = n - 1; i; --i) {
    while (ans.size() > now &&
           Cross(ans.back() - *(ans.end() - 2), node[i] - *(ans.end() - 2)) < 0)
      ans.pop_back();
    ans.push_back(node[i]);
  }
  return ans;
}
void Rotating_Calipers(deque<Point> &a) {
  a.pop_back();
  int n = a.size();
  for (int i = 0; i < n; ++i) a.push_back(a[i]);
  for (int i = 0; i < n; ++i) {
    int node = i;
    for (int j = i + 1; j < n; ++j) {
      while (Cross(a[node + 1] - a[node], a[j] - a[i]) <= 0) ++node;
      if (abs(Cross(B - A, C - A)) < abs(Cross(a[i] - a[node], a[j] - a[node])))
        A = a[node], B = a[i], C = a[j];
    }
  }
}
int main() {
  read();
  deque<Point> a = Andrew(n, node);
  Rotating_Calipers(a);
  Point D, E, F;
  D = B + C - A;
  E = A + C - B;
  F = A + B - C;
  printf("%I64d %I64d\n%I64d %I64d\n%I64d %I64d\n", D.x, D.y, E.x, E.y, F.x,
         F.y);
  return 0;
}
