#include <bits/stdc++.h>
using namespace std;
const int MAXN = int(1E6);
const double INF = 1E10;
const double EPS = 1E-9;
int dcmp(double x) { return fabs(x) <= 0 ? 0 : (x > 0 ? 1 : -1); }
struct nd {
  double x, y;
  nd() : x(), y() {}
  nd(double _x, double _y) : x(_x), y(_y) {}
  friend nd operator+(nd a, nd b) { return nd(a.x + b.x, a.y + b.y); }
  friend nd operator-(nd a, nd b) { return nd(a.x - b.x, a.y - b.y); }
  friend nd operator*(nd a, double k) { return nd(a.x * k, a.y * k); }
  friend nd operator/(nd a, double k) { return nd(a.x / k, a.y / k); }
  friend double operator*(nd a, nd b) { return a.x * b.x + a.y * b.y; }
  friend double operator^(nd a, nd b) { return a.x * b.y - a.y * b.x; }
  friend bool operator<(nd a, nd b) {
    return (a.x == b.x ? a.y < b.y : a.x < b.x);
  }
  friend bool operator==(nd a, nd b) { return (a.x == b.x) && (a.y == b.y); }
  friend double length(nd a) { return sqrt(a * a); }
  friend double dist(nd a, nd b) { return length(a - b); }
  friend double area(nd a, nd b, nd c) { return ((c - a) ^ (b - a)) / 2; }
  friend double slope(nd a, nd b) {
    if (a.x == b.x)
      return a.y < b.y ? INF : -INF;
    else
      return 1.0 * (a.y - b.y) / (a.x - b.x);
  }
  friend void read(nd &a) { scanf("%lf%lf", &a.x, &a.y); }
};
double dis2(nd x, nd y) {
  return sqrt((x.x - y.x) * (x.x - y.x) + (x.y - y.y) * (x.y - y.y));
}
double crs(nd x, nd y) { return x.x * y.y - x.y * y.x; }
nd stk[MAXN + 5], t[MAXN + 5], a[MAXN + 5];
int siz, cnt, tp;
void convex() {
  sort(a + 1, a + cnt + 1);
  stk[tp = 1] = a[1];
  for (int i = 2; i <= cnt; i++) {
    if (a[i] == a[i - 1]) continue;
    while (tp >= 2 && slope(stk[tp - 1], stk[tp]) <= slope(stk[tp], a[i])) tp--;
    stk[++tp] = a[i];
  }
  for (int i = 1; i <= tp; i++) t[++siz] = stk[i];
  stk[tp = 1] = a[1];
  for (int i = 2; i <= cnt; i++) {
    if (a[i] == a[i - 1]) continue;
    while (tp >= 2 && slope(stk[tp - 1], stk[tp]) >= slope(stk[tp], a[i])) tp--;
    stk[++tp] = a[i];
  }
  for (int i = tp - 1; i >= 2; i--) t[++siz] = stk[i];
}
int nxt(int x) { return (x == siz ? 1 : x + 1); }
void print(nd p) { printf("%.0f %.0f\n", p.x, p.y); }
void solve() {
  convex();
  int i;
  vector<nd> cov;
  for (i = 1; i <= siz; i++) cov.push_back(t[i]);
  double ans = -1e18;
  int res = 0;
  for (i = 0; i < cov.size(); i++) {
    int j = (i + 1) % cov.size();
    int k = (i + 2) % cov.size();
    double tmp = dis2(cov[i], cov[j]) * dis2(cov[i], cov[k]) *
                 dis2(cov[j], cov[k]) / 4 /
                 abs(crs(cov[j] - cov[i], cov[k] - cov[i]) / 2);
    if (tmp > ans) {
      ans = tmp;
      res = i;
    }
  }
  printf("%.0f %.0f\n", cov[res].x, cov[res].y);
  printf("%.0f %.0f\n", cov[(res + 1) % cov.size()].x,
         cov[(res + 1) % cov.size()].y);
  printf("%.0f %.0f\n", cov[(res + 2) % cov.size()].x,
         cov[(res + 2) % cov.size()].y);
}
void update1(nd p) {
  if ((0 <= p.x && p.x <= 1E5 && 0 <= p.y && p.y <= 1E5)) a[++cnt] = p;
}
void update2(nd p, double v, nd x) {
  if ((fabs(x.x - p.x) + fabs(x.y - p.y) <= v)) a[++cnt] = x;
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    double x, y, r;
    scanf("%lf%lf%lf", &x, &y, &r);
    if (x + r <= 1e5)
      update1((nd){x + r, y});
    else {
      update1((nd){1e5, y - (r - (1e5 - x))});
      update1((nd){1e5, y + (r - (1e5 - x))});
    }
    if (x - r >= 0)
      update1((nd){x - r, y});
    else {
      update1((nd){0, y - (r - x)});
      update1((nd){0, y + (r - x)});
    }
    if (y + r <= 1e5)
      update1((nd){x, y + r});
    else {
      update1((nd){x - (r - (1e5 - y)), 1e5});
      update1((nd){x + (r - (1e5 - y)), 1e5});
    }
    if (y - r >= 0)
      update1((nd){x, y - r});
    else {
      update1((nd){x - (r - y), 0});
      update1((nd){x + (r - y), 0});
    }
    update2((nd){x, y}, r, (nd){0, 0});
    update2((nd){x, y}, r, (nd){0, 1e5});
    update2((nd){x, y}, r, (nd){1e5, 0});
    update2((nd){x, y}, r, (nd){1e5, 1e5});
  }
  solve();
}
