#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
int n;
int hsy[maxn << 1], pn;
int x[maxn], y[maxn], c[maxn];
long long mx, pos;
vector<int> g[maxn << 1];
struct node {
  int l, r, pos;
  long long mx, lazy;
} tr[maxn << 2];
void pushup(int i) {
  if (tr[i << 1].mx > tr[i << 1 | 1].mx)
    tr[i].mx = tr[i << 1].mx, tr[i].pos = tr[i << 1].pos;
  else
    tr[i].mx = tr[i << 1 | 1].mx, tr[i].pos = tr[i << 1 | 1].pos;
}
void pushdown(int i) {
  if (!tr[i].lazy) return;
  tr[i << 1].mx += tr[i].lazy;
  tr[i << 1].lazy += tr[i].lazy;
  tr[i << 1 | 1].mx += tr[i].lazy;
  tr[i << 1 | 1].lazy += tr[i].lazy;
  tr[i].lazy = 0;
}
void build(int l, int r, int i) {
  tr[i] = node{l, r, l, 0, 0};
  if (l == r) {
    tr[i].mx = hsy[l];
    tr[i].pos = l;
    return;
  }
  int mid = l + r >> 1;
  build(l, mid, i << 1);
  build(mid + 1, r, i << 1 | 1);
  pushup(i);
}
void update(int l, int r, long long val, int i) {
  if (l <= tr[i].l && tr[i].r <= r) {
    tr[i].mx += val;
    tr[i].lazy += val;
    return;
  }
  pushdown(i);
  int mid = tr[i].l + tr[i].r >> 1;
  if (l <= mid) update(l, r, val, i << 1);
  if (mid < r) update(l, r, val, i << 1 | 1);
  pushup(i);
}
void query(int l, int r, int i) {
  if (l <= tr[i].l && tr[i].r <= r) {
    if (tr[i].mx > mx) {
      mx = tr[i].mx;
      pos = tr[i].pos;
    }
    return;
  }
  pushdown(i);
  int mid = tr[i].l + tr[i].r >> 1;
  if (l <= mid) query(l, r, i << 1);
  if (r > mid) query(l, r, i << 1 | 1);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) {
    scanf("%d%d%d", x + i, y + i, c + i);
    if (x[i] > y[i]) swap(x[i], y[i]);
    hsy[++pn] = x[i];
    hsy[++pn] = y[i];
  }
  sort(hsy + 1, hsy + 1 + pn);
  pn = unique(hsy + 1, hsy + 1 + pn) - hsy - 1;
  build(1, pn, 1);
  for (int i = 1; i <= n; ++i) {
    x[i] = lower_bound(hsy + 1, hsy + 1 + pn, x[i]) - hsy;
    y[i] = lower_bound(hsy + 1, hsy + 1 + pn, y[i]) - hsy;
    g[y[i]].emplace_back(i);
  }
  long long ans = 0, ansx = 2e9, ansy = 2e9;
  for (int i = 1; i <= pn; ++i) {
    for (auto v : g[i]) update(1, x[v], c[v], 1);
    mx = pos = 0;
    query(1, i, 1);
    mx -= hsy[i];
    if (mx > ans) {
      ans = mx;
      ansx = hsy[pos];
      ansy = hsy[i];
    }
  }
  printf("%lld\n%lld %lld %lld %lld\n", ans, ansx, ansx, ansy, ansy);
  return 0;
}
