#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 1e6 + 10;
const long long lim = 1e5;
const long long INF = 2e9;
const double eps = 1e-6;
const double PI = acos(-1);
struct vec {
  long long x, y;
  vec(long long _x = 0, long long _y = 0) : x(_x), y(_y) {}
  long long operator*(const vec &b) const { return x * b.y - y * b.x; }
  vec operator+(const vec &b) const { return vec(x + b.x, y + b.y); }
  vec operator-(const vec &b) const { return vec(x - b.x, y - b.y); }
  double len() { return sqrt(1. * (x * x) + 1. * (y * y)); }
  bool operator<(const vec &b) const {
    return x < b.x || (x == b.x && y < b.y);
  }
  bool operator==(const vec &b) const { return x == b.x && y == b.y; }
} p[MAXN], stk[MAXN];
long long n, m, cnt;
long long x[MAXN], y[MAXN], v[MAXN];
long long top, pos;
double Max;
template <typename T>
inline bool read(T &a) {
  a = 0;
  char c = getchar();
  long long f = 1;
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    a = a * 10 + (c ^ 48);
    c = getchar();
  }
  return a *= f, true;
}
template <typename A, typename... B>
inline bool read(A &x, B &...y) {
  return read(x) && read(y...);
}
void Add(long long x, long long y) { p[++cnt] = vec(x, y); }
long long dis2(vec a) { return a.x * a.x + a.y * a.y; }
bool cmp(vec a, vec b) {
  static long long d;
  d = (a - p[1]) * (b - p[1]);
  if (d > 0) return true;
  if (!d) return dis2(a - p[1]) < dis2(b - p[1]);
  return false;
}
double calc(long long x) {
  static vec a, b, c;
  a = stk[x + 1] - stk[x], b = stk[x + 2] - stk[x + 1], c = stk[x + 2] - stk[x];
  return (a.len() * b.len() * c.len()) /
         (2. * ((a * c) < 0 ? (-(a * c)) : (a * c)));
}
signed main() {
  read(n);
  for (long long i = 1; i <= n; ++i) {
    read(x[i]), read(y[i]), read(v[i]);
    if (x[i] - v[i] >= 0)
      Add(x[i] - v[i], y[i]);
    else {
      Add(0, min(y[i] + (v[i] - x[i]), lim));
      Add(0, max(y[i] - (v[i] - x[i]), 0ll));
    }
    if (x[i] + v[i] <= lim)
      Add(x[i] + v[i], y[i]);
    else {
      Add(lim, min(y[i] + (x[i] + v[i] - lim), lim));
      Add(lim, max(y[i] - (x[i] + v[i] - lim), 0ll));
    }
    if (y[i] - v[i] >= 0)
      Add(x[i], y[i] - v[i]);
    else {
      Add(min(x[i] + (v[i] - y[i]), lim), 0);
      Add(max(x[i] - (v[i] - y[i]), 0ll), 0);
    }
    if (y[i] + v[i] <= lim)
      Add(x[i], y[i] + v[i]);
    else {
      Add(min(x[i] + (y[i] + v[i] - lim), lim), lim);
      Add(max(x[i] - (y[i] + v[i] - lim), 0ll), lim);
    }
  }
  sort(p + 1, p + cnt + 1);
  cnt = unique(p + 1, p + cnt + 1) - p - 1;
  for (long long i = 2; i <= cnt; ++i)
    if (p[1].y > p[i].y) swap(p[1], p[i]);
  sort(p + 2, p + cnt + 1, cmp);
  stk[++top] = p[1];
  for (long long i = 2; i <= cnt; ++i) {
    while (top > 1 && (stk[top] - stk[top - 1]) * (p[i] - stk[top - 1]) <= 0)
      top--;
    stk[++top] = p[i];
  }
  stk[++top] = stk[1];
  stk[++top] = stk[2];
  for (long long i = 1; i <= top - 2; ++i) {
    double len = calc(i);
    if (!pos || len > Max) Max = len, pos = i;
  }
  for (long long i = pos; i <= pos + 2; ++i)
    printf("%lld %lld\n", stk[i].x, stk[i].y);
  return 0;
}
