#include <bits/stdc++.h>
using namespace std;
long long rdtsc() {
  long long tmp;
  asm("rdtsc" : "=A"(tmp));
  return tmp;
}
inline int myrand() { return abs((rand() << 15) ^ rand()); }
inline int rnd(int x) { return myrand() % x; }
const int INF = (int)1.01e9;
const long double EPS = 1e-9;
void precalc() {}
struct Point {
  int x, y;
  int read() {
    if (scanf("%d%d", &x, &y) < 2) {
      return 0;
    }
    return 1;
  }
  Point() {}
  Point(int _x, int _y) : x(_x), y(_y) {}
  inline bool operator==(const Point &p) const { return x == p.x && y == p.y; }
  inline bool operator<(const Point &p) const {
    if (y != p.y) {
      return y < p.y;
    }
    return x < p.x;
  }
  inline Point operator-(const Point &p) const {
    return Point(x - p.x, y - p.y);
  }
  inline Point operator+(const Point &p) const {
    return Point(x + p.x, y + p.y);
  }
  inline long long operator^(const Point &p) const {
    return (long long)x * p.y - (long long)y * p.x;
  }
  inline long long sabs() const { return (long long)x * x + (long long)y * y; }
  inline long double abs() const { return sqrt(sabs()); }
};
const int maxn = (int)1e5 + 10;
Point ps[maxn];
int vs[maxn];
int n;
bool read() {
  if (scanf("%d", &n) < 1) {
    return 0;
  }
  for (int i = 0; i < n; ++i) {
    assert(ps[i].read() && scanf("%d", &vs[i]) == 1);
  }
  return 1;
}
const int maxq = maxn * 8;
Point qs[maxq];
struct angleComp {
  static Point p;
  inline bool operator()(const Point &p1, const Point &p2) {
    Point q1 = p1 - p, q2 = p2 - p;
    long long tmp = q1 ^ q2;
    if (tmp) {
      return tmp > 0;
    }
    return q1.sabs() < q2.sabs();
  }
};
Point angleComp::p;
const int maxg = 4;
const int go[maxg][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
const int maxc = (int)1e5;
Point goNow(Point p, int g, int &left) {
  p = p + Point(go[g][0] * left, go[g][1] * left);
  int use = max(0, max(-p.x, max(p.x - maxc, max(-p.y, p.y - maxc))));
  if (use) {
    p = p - Point(go[g][0] * use, go[g][1] * use);
  }
  left = use;
  return p;
}
void solve() {
  int cnt = 0;
  for (int i = 0; i < n; ++i) {
    for (int g1 = 0; g1 < 4; ++g1) {
      int left = vs[i];
      Point p = goNow(ps[i], g1, left);
      if (!left) {
        qs[cnt++] = p;
      } else {
        int g2 = (g1 ^ 1);
        for (int it = 0; it < 2; ++it) {
          int nleft = left;
          Point q = goNow(p, g2, nleft);
          qs[cnt++] = q;
          g2 ^= 2;
        }
      }
    }
  }
  angleComp::p = *min_element(qs, qs + cnt);
  sort(qs, qs + cnt, angleComp());
  int cnt0 = cnt;
  cnt = 0;
  for (int i = 0; i < cnt0; ++i) {
    Point cur = qs[i];
    if (cnt && cur == qs[cnt - 1]) {
      continue;
    }
    while (cnt >= 2 &&
           ((cur - qs[cnt - 1]) ^ (qs[cnt - 1] - qs[cnt - 2])) >= 0ll) {
      --cnt;
    }
    qs[cnt++] = cur;
  }
  qs[cnt] = qs[0], qs[cnt + 1] = qs[1];
  long double res = -1;
  Point ra, rb, rc;
  for (int i = 0; i < cnt; ++i) {
    Point a = qs[i], b = qs[i + 1], c = qs[i + 2];
    long long S2 = abs((b - a) ^ (c - a));
    long double value =
        (a - b).abs() * (a - c).abs() * (b - c).abs() / (S2 * 2);
    if (res < value) {
      res = value;
      ra = a, rb = b, rc = c;
    }
  }
  printf("%d %d\n", ra.x, ra.y);
  printf("%d %d\n", rb.x, rb.y);
  printf("%d %d\n", rc.x, rc.y);
}
int main() {
  srand(rdtsc());
  precalc();
  while (1) {
    if (!read()) {
      break;
    }
    solve();
  }
  return 0;
}
