#include <bits/stdc++.h>
int read() {
  int ans = 0, c, f = 1;
  while (!isdigit(c = getchar()))
    if (c == '-') f *= -1;
  do ans = ans * 10 + c - '0';
  while (isdigit(c = getchar()));
  return ans * f;
}
const int L = 100000;
struct Point {
  long long x, y;
  Point() {}
  Point(long long x, long long y) : x(x), y(y) {}
  inline friend long long dot(const Point &a, const Point &b) {
    return a.x * b.x + a.y * b.y;
  }
  inline friend long long cross(const Point &a, const Point &b) {
    return a.x * b.y - a.y * b.x;
  }
  inline friend Point operator-(const Point &a, const Point &b) {
    return Point(a.x - b.x, a.y - b.y);
  }
  inline double len() const { return sqrt(x * x + y * y); }
} P[L * 2 + 10];
int u[L + 10], d[L + 10];
inline void add(int x, int y) {
  u[x] = std::max(u[x], y);
  d[x] = std::min(d[x], y);
}
int main() {
  int n = read();
  memset(u, -1, sizeof u);
  memset(d, 0x3f, sizeof d);
  for (int i = 0; i < n; ++i) {
    int x = read(), y = read(), v = read();
    for (int t = std::max(-v, -x); t <= std::min(v, L - x); ++t) {
      int k = v - std::abs(t);
      add(x + t, std::min(y + k, L));
      add(x + t, std::max(y - k, 0));
    }
  }
  int m = 0;
  for (int x = 0; x <= L; ++x)
    if (u[x] >= 0) {
      Point t = Point(x, u[x]);
      while (m > 1 && cross(t - P[m - 1], t - P[m - 2]) <= 0) --m;
      P[m++] = t;
    }
  for (int x = L; x >= 0; --x)
    if (d[x] <= L) {
      Point t = Point(x, d[x]);
      while (m > 1 && cross(t - P[m - 1], t - P[m - 2]) <= 0) --m;
      P[m++] = t;
    }
  if (P[m - 1].y == P[0].y) --m;
  double ans = .0;
  int k = -1;
  for (int i = 0; i < m; ++i) {
    Point A = P[i], B = P[(i + 1) % m], C = P[(i + 2) % m];
    Point u = B - A, v = C - B, w = A - C;
    double rr = (double)u.len() * v.len() * w.len() / cross(v, u);
    if (rr > ans) ans = rr, k = i;
  }
  printf("%I64d %I64d\n", P[k].x, P[k].y);
  printf("%I64d %I64d\n", P[(k + 1) % m].x, P[(k + 1) % m].y);
  printf("%I64d %I64d\n", P[(k + 2) % m].x, P[(k + 2) % m].y);
  return 0;
}
