#include <bits/stdc++.h>
using namespace std;
struct point {
  int x, y, c;
};
bool operator<(const point& c, const point& d) {
  return min(c.x, c.y) < min(d.x, d.y);
}
vector<pair<long long, int>> st(10);
vector<long long> lazy(10, 0);
void build_tree(int node, int l, int r, vector<int>& a) {
  if (l == r)
    st[node] = {a[l - 1] - a.front(), l};
  else {
    int mid = (l + r) >> 1;
    build_tree(node << 1, l, mid, a);
    build_tree(node << 1 | 1, mid + 1, r, a);
    st[node] = max(st[node << 1], st[node << 1 | 1]);
  }
}
void push(int node) {
  if (!lazy[node]) return;
  st[node << 1].first += lazy[node];
  lazy[node << 1] += lazy[node];
  st[node << 1 | 1].first += lazy[node];
  lazy[node << 1 | 1] += lazy[node];
  lazy[node] = 0;
}
void update_tree(int node, int l, int r, int u, int v, int val) {
  if (v < l || r < u) return;
  if (u <= l && r <= v) {
    st[node].first += val;
    lazy[node] += val;
  } else {
    int mid = (l + r) >> 1;
    push(node);
    update_tree(node << 1, l, mid, u, v, val);
    update_tree(node << 1 | 1, mid + 1, r, u, v, val);
    st[node] = max(st[node << 1], st[node << 1 | 1]);
  }
}
pair<long long, int> get_tree(int node, int l, int r, int u, int v) {
  if (v < l || r < u) return {-1e18, 0};
  if (u <= l && r <= v) return st[node];
  int mid = (l + r) >> 1;
  push(node);
  pair<long long, int> get_1 = get_tree(node << 1, l, mid, u, v),
                       get_2 = get_tree(node << 1 | 1, mid + 1, r, u, v);
  return max(get_2, get_1);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int n;
  cin >> n;
  vector<point> b(n);
  for (int i = 0; i < n; ++i) {
    cin >> b[i].x >> b[i].y >> b[i].c;
    if (b[i].x > b[i].y) swap(b[i].x, b[i].y);
  }
  sort(b.begin(), b.end(),
       [](const point& c, const point& d) { return c.x < d.x; });
  vector<int> m;
  m.push_back(min(b.front().x, b.front().y));
  for (int i = 1; i < n; ++i)
    if (b[i].x != m.back()) m.push_back(b[i].x);
  sort(b.begin(), b.end(),
       [](const point& c, const point& d) { return c.y < d.y; });
  st.resize(4 * m.size() + 1);
  lazy.resize(4 * m.size() + 1, 0);
  build_tree(1, 1, m.size(), m);
  long long ans = 0, cur = 0;
  int ox = 2e9, oy = 2e9, cnt = 0, f = -1;
  while (cnt < n) {
    f = b[cnt].y;
    while (cnt < n && b[cnt].y == f) {
      cur += b[cnt].c;
      int pos = lower_bound(m.begin(), m.end(), b[cnt].x) - m.begin();
      update_tree(1, 1, m.size(), pos + 1, m.size(), -b[cnt].c);
      ++cnt;
    }
    int pos = lower_bound(m.begin(), m.end(), f) - m.begin();
    long long now = cur - f + m.front();
    pair<long long, int> get = get_tree(1, 1, m.size(), 1, pos);
    if (get.first != -1e18 &&
        now + get.first + m[get.second] - m[get.second - 1] > ans &&
        m[get.second] <= f)
      ans = now + get.first + m[get.second] - m[get.second - 1],
      ox = m[get.second], oy = f;
    if (now > ans) ans = now, ox = m.front(), oy = f;
  }
  cout << ans << '\n' << ox << " " << ox << " " << oy << " " << oy << '\n';
  return 0;
}
