#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500100;
int n;
int x[MAXN], y[MAXN], c[MAXN];
vector<int> coords;
void load() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d%d%d", x + i, y + i, c + i);
    if (x[i] > y[i]) swap(x[i], y[i]);
    coords.push_back(y[i]);
  }
  sort(coords.begin(), coords.end());
  coords.resize(unique(coords.begin(), coords.end()) - coords.begin());
}
int getCoord(int x) {
  return lower_bound(coords.begin(), coords.end(), x) - coords.begin();
}
int m, h;
struct node {
  long long val, lazy;
  int tkoMaxi;
  node(long long val, long long lazy) : val(val), lazy(lazy) {}
  node() {
    val = lazy = 0;
    tkoMaxi = -1;
  }
} tree[2 * MAXN];
void update(int p) {
  tree[p].val = tree[p << 1].val;
  tree[p].tkoMaxi = tree[p << 1].tkoMaxi;
  if (tree[p << 1].val < tree[p << 1 | 1].val) {
    tree[p].val = tree[p << 1 | 1].val;
    tree[p].tkoMaxi = tree[p << 1 | 1].tkoMaxi;
  }
  tree[p].val += tree[p].lazy;
};
void apply(int p, long long val) {
  tree[p].val += val;
  if (p < n) tree[p].lazy += val;
}
void build(int p) {
  for (p >>= 1; p; p >>= 1) {
    update(p);
  }
}
void push(int p) {
  for (int s = h; s > 0; s--) {
    int anc = p >> s;
    if (tree[anc].lazy) {
      apply(anc << 1, tree[anc].lazy);
      apply(anc << 1 | 1, tree[anc].lazy);
      tree[anc].lazy = 0;
    }
  }
}
void inc(int l, int r, long long val) {
  l += m;
  r += m;
  for (int l0 = l, r0 = r; l0 < r0; l0 >>= 1, r0 >>= 1) {
    if (l0 & 1) apply(l0++, val);
    if (r0 & 1) apply(--r0, val);
  }
  build(l);
  build(r - 1);
}
pair<long long, int> query(int l, int r) {
  l += m;
  r += m;
  push(l);
  push(r - 1);
  pair<long long, int> res = {-3e18, -1};
  for (; l < r; l >>= 1, r >>= 1) {
    if (l & 1) {
      res = max(res, {tree[l].val, tree[l].tkoMaxi});
      l++;
    }
    if (r & 1) {
      r--;
      res = max({tree[r].val, tree[r].tkoMaxi}, res);
    }
  }
  return res;
}
void build_tree() {
  for (int i = m - 1; i; i--) {
    update(i);
  }
}
void solve() {
  m = coords.size();
  h = sizeof(int) * 8 - __builtin_clz(m);
  for (int coord : coords) {
    tree[m + getCoord(coord)].val = -coord;
    tree[m + getCoord(coord)].tkoMaxi = coord;
  }
  build_tree();
  vector<pair<int, int> > lefts;
  for (int i = 0; i < n; i++) lefts.push_back({x[i], i});
  sort(lefts.begin(), lefts.end(), std::greater<pair<int, int> >());
  long long maxi = 0;
  pair<int, int> best = {1e9 + 1, 1e9 + 1};
  for (int i = 0; i < n; i++) {
    pair<int, int> p = lefts[i];
    int ind = p.second;
    inc(getCoord(y[ind]), m, c[ind]);
    if (i < n - 1 && lefts[i + 1].first == p.first) continue;
    auto res = query(getCoord(p.first), m);
    long long temp = (long long)p.first + res.first;
    if (temp > maxi) {
      maxi = temp;
      best = {p.first, res.second};
    }
  }
  printf("%lld\n%d %d %d %d\n", maxi, best.first, best.first, best.second,
         best.second);
}
int main() {
  load();
  solve();
  return 0;
}
