#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500005;
const int SIZE = 1 << 21;
const long long INF = 1ll << 60;
struct Point {
  int x, y, c;
};
int n;
Point p[MAXN];
pair<long long, int> tree[SIZE];
long long lazy[SIZE], tmp[MAXN * 2];
map<int, int> mp, rv;
set<int> sq;
int aq[SIZE * 2];
bool comp_min(Point A, Point B) { return min(A.x, A.y) < min(B.x, B.y); }
bool comp_max(Point A, Point B) { return max(A.x, A.y) < max(B.x, B.y); }
void build(int v = 1, int l = 1, int r = 2 * n) {
  if (l == r) {
    tree[v] = {tmp[l], l};
    return;
  }
  int mid = (l + r) >> 1;
  build(v << 1 | 0, l, mid + 0);
  build(v << 1 | 1, mid + 1, r);
  tree[v] = max(tree[v << 1 | 0], tree[v << 1 | 1]);
}
void oper(int v, int l, int r) {
  if (lazy[v] != 0) {
    tree[v].first += lazy[v];
    if (l != r) {
      lazy[v << 1 | 0] += lazy[v];
      lazy[v << 1 | 1] += lazy[v];
    }
    lazy[v] = 0;
  }
}
pair<long long, int> query(int le, int ri, int v = 1, int l = 1,
                           int r = 2 * n) {
  oper(v, l, r);
  if (r < le or l > ri) return {-INF, 0};
  if (le <= l and r <= ri) return tree[v];
  int mid = (l + r) >> 1;
  return max(query(le, ri, v << 1 | 0, l, mid + 0),
             query(le, ri, v << 1 | 1, mid + 1, r));
}
void update(int le, int ri, int del, int v = 1, int l = 1, int r = 2 * n) {
  oper(v, l, r);
  if (r < le or l > ri) return;
  if (le <= l and r <= ri) {
    lazy[v] += del;
    oper(v, l, r);
    return;
  }
  int mid = (l + r) >> 1;
  update(le, ri, del, v << 1 | 0, l, mid + 0);
  update(le, ri, del, v << 1 | 1, mid + 1, r);
  tree[v] = max(tree[v << 1 | 0], tree[v << 1 | 1]);
}
int main() {
  ios ::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    cin >> p[i].x >> p[i].y >> p[i].c;
    sq.insert(p[i].x);
    sq.insert(p[i].y);
  }
  int idx = 0;
  for (int q : sq) {
    aq[++idx] = q;
    mp[q] = idx;
    rv[idx] = q;
  }
  sort(p + 1, p + n + 1, comp_max);
  int it = 1;
  for (int i = 1; i <= idx; ++i) {
    tmp[i] = tmp[i - 1] + aq[i - 1] - aq[i];
    while (it <= n and max(p[it].x, p[it].y) <= aq[i]) {
      tmp[i] += p[it].c;
      ++it;
    }
  }
  sort(p + 1, p + n + 1, comp_min);
  build();
  long long ans = 0, x = 1 << 30, y = 1 << 30;
  for (int i = 1; i <= n; ++i) {
    if (i == 1 or min(p[i].x, p[i].y) != min(p[i - 1].x, p[i - 1].y)) {
      if (ans <
          query(mp[min(p[i].x, p[i].y)], idx).first + min(p[i].x, p[i].y)) {
        ans = query(mp[min(p[i].x, p[i].y)], idx).first + min(p[i].x, p[i].y);
        x = min(p[i].x, p[i].y);
        y = rv[query(mp[min(p[i].x, p[i].y)], idx).second];
      }
    }
    int l = mp[max(p[i].x, p[i].y)];
    update(l, idx, -p[i].c);
  }
  cout << ans << endl;
  cout << x << ' ' << x << ' ' << y << ' ' << y << endl;
  return 0;
}
