#include <bits/stdc++.h>
using namespace std;
const int Maxn = 5e5;
const long long INF = 0x3f3f3f3f3f3f3f3f;
int N;
int X[Maxn + 5], Y[Maxn + 5];
long long Val[Maxn + 5];
vector<long long> val;
vector<pair<int, long long> > g[Maxn * 2 + 5];
struct SegmentTree {
  struct Segment {
    long long sum, tag;
    int pos;
  };
  Segment t[Maxn * 8 + 5];
  void pushup(int rt) {
    if (t[rt << 1].sum > t[rt << 1 | 1].sum)
      t[rt].sum = t[rt << 1].sum, t[rt].pos = t[rt << 1].pos;
    else
      t[rt].sum = t[rt << 1 | 1].sum, t[rt].pos = t[rt << 1 | 1].pos;
  }
  void pushdown(int rt) {
    if (t[rt].tag != 0) {
      t[rt << 1].sum += t[rt].tag;
      t[rt << 1].tag += t[rt].tag;
      t[rt << 1 | 1].sum += t[rt].tag;
      t[rt << 1 | 1].tag += t[rt].tag;
      t[rt].tag = 0;
    }
  }
  void build(int rt, int l, int r) {
    if (l == r) {
      t[rt].sum = -val[l], t[rt].pos = l;
      return;
    }
    int mid = (l + r) >> 1;
    build(rt << 1, l, mid), build(rt << 1 | 1, mid + 1, r);
    pushup(rt);
  }
  void modify(int rt, int l, int r, int ml, int mr, long long val) {
    if (r < ml || l > mr) return;
    if (ml <= l && r <= mr) {
      t[rt].sum += val, t[rt].tag += val;
      return;
    }
    pushdown(rt);
    int mid = (l + r) >> 1;
    modify(rt << 1, l, mid, ml, mr, val),
        modify(rt << 1 | 1, mid + 1, r, ml, mr, val);
    pushup(rt);
  }
  void query(int rt, int l, int r, int ql, int qr, long long &res, int &id) {
    if (r < ql || l > qr) return;
    if (ql <= l && r <= qr) {
      if (res < t[rt].sum) {
        res = t[rt].sum;
        id = t[rt].pos;
      }
      return;
    }
    pushdown(rt);
    int mid = (l + r) >> 1;
    query(rt << 1, l, mid, ql, qr, res, id),
        query(rt << 1 | 1, mid + 1, r, ql, qr, res, id);
    pushup(rt);
  }
};
SegmentTree tree;
int main() {
  scanf("%d", &N);
  for (int i = 1; i <= N; i++) {
    scanf("%d %d %lld", &X[i], &Y[i], &Val[i]);
    val.push_back(X[i]), val.push_back(Y[i]);
  }
  val.push_back(-1);
  sort(val.begin(), val.end());
  val.erase(unique(val.begin(), val.end()), val.end());
  for (int i = 1; i <= N; i++) {
    X[i] = lower_bound(val.begin(), val.end(), X[i]) - val.begin();
    Y[i] = lower_bound(val.begin(), val.end(), Y[i]) - val.begin();
    if (X[i] > Y[i]) swap(X[i], Y[i]);
    g[X[i]].push_back(make_pair(Y[i], Val[i]));
  }
  int siz = val.size() - 1;
  long long ans = 0;
  int ans_x = val[siz] + 1, ans_y = val[siz] + 1;
  tree.build(1, 1, siz);
  for (int i = siz; i >= 1; i--) {
    for (int j = 0; j < (int)g[i].size(); j++)
      tree.modify(1, 1, siz, g[i][j].first, siz, g[i][j].second);
    long long res = -INF;
    int id = -1;
    tree.query(1, 1, siz, i, siz, res, id);
    if (res + val[i] > ans) {
      ans = res + val[i];
      ans_x = val[i], ans_y = val[id];
    }
  }
  printf("%lld\n%d %d %d %d\n", ans, ans_x, ans_x, ans_y, ans_y);
  return 0;
}
