#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void rd(T &x) {
  x = 0;
  char c = getchar();
  int f = 1;
  while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (isdigit(c)) x = x * 10 - '0' + c, c = getchar();
  x *= f;
}
long long Abs(long long x) { return x > 0 ? x : -x; }
const long double eps = 1e-10;
int dcmp(long double x) { return x < -eps ? -1 : (x > eps); }
struct Point {
  long long x, y;
  Point(long long x = 0, long long y = 0) : x(x), y(y) {}
  friend Point operator+(Point A, Point B) {
    return Point(A.x + B.x, A.y + B.y);
  }
  friend Point operator-(Point A, Point B) {
    return Point(A.x - B.x, A.y - B.y);
  }
  friend Point operator/(Point A, long long B) {
    return Point(A.x / B, A.y / B);
  }
  friend Point operator*(Point A, long long B) {
    return Point(A.x * B, A.y * B);
  }
} p[800010];
int n;
long long Cross(Point A, Point B) { return A.x * B.y - A.y * B.x; }
long long Dot(Point A, Point B) { return A.x * B.x + A.y * B.y; }
long double len(Point A) { return sqrt(A.x * A.x + A.y * A.y); }
long double ag(Point A, Point B) { return Cross(A, B) / len(A) / len(B); }
namespace Convex_Hull {
Point stk[800010];
int top = 0;
int rnk[800010];
long double ag[800010];
bool cmp(int x, int y) {
  return dcmp(ag[x] - ag[y]) == 0
             ? (p[x].x == p[y].x ? p[x].y < p[y].y : p[x].x < p[y].x)
             : ag[x] < ag[y];
}
void convex_hull() {
  for (int i = 1; i < n; ++i)
    if (p[i].x < p[0].x || p[i].x == p[0].x && p[i].y < p[0].y)
      swap(p[i], p[0]);
  for (int i = 1; i < n; ++i)
    ag[i] = atan2(p[i].y - p[0].y, p[i].x - p[0].x), rnk[i] = i;
  sort(rnk + 1, rnk + n, cmp);
  stk[top = 0] = p[0];
  for (int i = 1; i < n; ++i) {
    while (top && Cross(stk[top] - stk[top - 1], p[rnk[i]] - stk[top - 1]) <= 0)
      top--;
    stk[++top] = p[rnk[i]];
  }
  for (int i = 0; i <= top; ++i) p[i] = stk[i];
  n = top + 1;
}
}  // namespace Convex_Hull
using Convex_Hull::convex_hull;
const int N = 1e5;
Point q[100];
int pcnt;
Point LIM[4][2] = {Point(0, 0), Point(0, N), Point(0, N), Point(N, N),
                   Point(N, N), Point(N, 0), Point(N, 0), Point(0, 0)};
void get(Point u, Point v) {
  for (int i = 0; i < 4; ++i) {
    long long s1 = Cross(v - u, LIM[i][0] - u);
    long long s2 = Cross(LIM[i][1] - u, v - u);
    if (s1 + s2 == 0) continue;
    q[pcnt++] = (LIM[i][0] * s2 + LIM[i][1] * s1) / (s1 + s2);
  }
}
int main() {
  int _T;
  rd(_T);
  while (_T--) {
    int x, y, v;
    rd(x), rd(y), rd(v);
    q[0] = Point(x, y - v);
    q[1] = Point(x - v, y);
    q[2] = Point(x, y + v);
    q[3] = Point(x + v, y);
    q[4] = Point(0, 0);
    q[5] = Point(0, N);
    q[6] = Point(N, 0);
    q[7] = Point(N, N);
    pcnt = 8;
    for (int i = 0; i < 4; ++i) get(q[i], q[(i + 1) % 4]);
    for (int i = 0; i < pcnt; ++i)
      if (Abs(q[i].x - x) + Abs(q[i].y - y) <= v && q[i].x >= 0 &&
          q[i].x <= N && q[i].y >= 0 && q[i].y <= N)
        p[n++] = q[i];
  }
  convex_hull();
  Point A1, A2, A3;
  long double ans = 0;
  for (int i = 0; i < n; ++i) {
    Point A = p[i], B = p[(i + 1) % n], C = p[(i + 2) % n];
    long double cur =
        len(A - C) * len(A - B) * len(B - C) / fabs(Cross(A - C, A - B));
    if (cur > ans) ans = cur, A1 = A, A2 = B, A3 = C;
  }
  printf("%lld %lld\n", A1.x, A1.y);
  printf("%lld %lld\n", A2.x, A2.y);
  printf("%lld %lld\n", A3.x, A3.y);
  return 0;
}
