#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500000 + 10, MAXT = MAXN * 8;
const long long LINF = 1LL << 60;
struct Seg {
  int x, y, c;
  bool operator<(const Seg &s1) const { return x < s1.x; }
} seg[MAXN];
int hashx[MAXT], cnt;
struct Segtree {
  int l, r;
  long long add, mx;
  int pos;
} t[MAXT];
int val[MAXT];
void updatemx(long long &mx, int &pos, long long mx1, int pos1) {
  if (mx1 > mx) {
    mx = mx1;
    pos = pos1;
  }
}
void pushup(int p) {
  t[p].mx = t[p << 1].mx;
  t[p].pos = t[p << 1].pos;
  updatemx(t[p].mx, t[p].pos, t[p << 1 | 1].mx, t[p << 1 | 1].pos);
}
void add_t(int p, long long d) {
  t[p].add += d;
  t[p].mx += d;
}
void pushdown(int p) {
  if (t[p].add != 0) {
    add_t(p << 1, t[p].add);
    add_t(p << 1 | 1, t[p].add);
    t[p].add = 0;
  }
}
void buildtree(int p, int l, int r) {
  t[p] = (Segtree){l, r, 0, 0, 0};
  if (l == r) {
    t[p].mx = (long long)val[l];
    t[p].pos = l;
    return;
  }
  int mid = (l + r) >> 1;
  buildtree(p << 1, l, mid);
  buildtree(p << 1 | 1, mid + 1, r);
  pushup(p);
}
void change(int p, int l, int r, int ql, int qr, long long d) {
  if (ql == l && qr == r) {
    add_t(p, d);
    return;
  }
  pushdown(p);
  int mid = (l + r) >> 1;
  if (ql <= mid) change(p << 1, l, mid, ql, min(qr, mid), d);
  if (qr > mid) change(p << 1 | 1, mid + 1, r, max(ql, mid + 1), qr, d);
  pushup(p);
}
long long que_mx(int p, int l, int r, int ql, int qr, int &pos) {
  if (ql == l && qr == r) {
    pos = t[p].pos;
    return t[p].mx;
  }
  pushdown(p);
  int mid = (l + r) >> 1;
  long long res = -LINF, temp_res;
  int temp_pos;
  if (ql <= mid) {
    temp_res = que_mx(p << 1, l, mid, ql, min(qr, mid), temp_pos);
    updatemx(res, pos, temp_res, temp_pos);
  }
  if (qr > mid) {
    temp_res = que_mx(p << 1 | 1, mid + 1, r, max(ql, mid + 1), qr, temp_pos);
    updatemx(res, pos, temp_res, temp_pos);
  }
  pushup(p);
  return res;
}
int findx(int key) {
  int l = 1, r = cnt;
  while (l < r) {
    int mid = (l + r) >> 1;
    if (hashx[mid] == key)
      return mid;
    else if (hashx[mid] < key)
      l = mid + 1;
    else
      r = mid - 1;
  }
  return l;
}
int main() {
  int n;
  scanf("%d", &n);
  cnt = 0;
  for (int i = 0; i < n; ++i) {
    scanf("%d%d%d", &seg[i].x, &seg[i].y, &seg[i].c);
    if (seg[i].x > seg[i].y) swap(seg[i].x, seg[i].y);
    hashx[++cnt] = seg[i].x;
    hashx[++cnt] = seg[i].y;
  }
  sort(hashx + 1, hashx + 1 + cnt);
  cnt = 1;
  for (int i = 2; i <= n * 2; ++i) {
    if (hashx[i] != hashx[i - 1]) {
      hashx[++cnt] = hashx[i];
    }
  }
  for (int i = 0; i < n; ++i) {
    seg[i].x = findx(seg[i].x);
    seg[i].y = findx(seg[i].y);
  }
  sort(seg, seg + n);
  memset(val, 0, sizeof(0));
  for (int i = 1; i <= cnt; ++i) val[i] = hashx[1] - hashx[i];
  buildtree(1, 1, cnt);
  for (int i = 0; i < n; ++i)
    change(1, 1, cnt, seg[i].y, cnt, (long long)seg[i].c);
  long long ans = -LINF;
  int ansl = -1, ansr = -1;
  int pos = 0;
  for (int l = 1; l <= cnt; ++l) {
    int temp_pos;
    long long que =
        que_mx(1, 1, cnt, l, cnt, temp_pos) + (long long)(hashx[l] - hashx[1]);
    if (que > ans) {
      ans = que;
      ansl = hashx[l];
      ansr = hashx[temp_pos];
    }
    while (pos < n && seg[pos].x == l) {
      change(1, 1, cnt, seg[pos].y, cnt, (long long)-seg[pos].c);
      ++pos;
    }
  }
  if (ans < 0) {
    ans = 0;
    ansl = ansr = hashx[cnt] + 1;
  }
  cout << ans << endl;
  cout << ansl << " " << ansl << " " << ansr << " " << ansr << endl;
  return 0;
}
