#include <bits/stdc++.h>
#pragma GCC optimize("Ofast", "unroll-loops", "omit-frame-pointer", "inline")
#pragma GCC option("arch=native", "tune=native", "no-zero-upper")
#pragma GCC target("avx2")
using namespace std;
int N;
int XL[2020], XR[2020], Y[2020];
signed long long LP[2020], RP[2020], Q[2020];
int A[2020];
double mi;
vector<pair<signed long long, signed long long>> P;
int rem[4040404];
template <typename V>
struct ConvexHull {
  deque<pair<V, V>> Q;
  V calc(pair<V, V> p, V x) { return p.first * x + p.second; }
  int dodo(pair<V, V> A, pair<V, V> B, pair<V, V> C) {
    return ((B.second - C.second) * (B.first - A.first) <=
            (A.second - B.second) * (C.first - B.first));
  }
  void add(V a, V b) {
    if (Q.size() && Q.back().first == a) {
      if (b <= Q.back().second) return;
      Q.pop_back();
    }
    Q.push_back({a, b});
    int v;
    while ((v = Q.size()) >= 3 && dodo(Q[v - 3], Q[v - 2], Q[v - 1]))
      Q[v - 2] = Q[v - 1], Q.pop_back();
  }
  void add(vector<pair<V, V>> v) {
    sort(v.begin(), v.end());
    for (auto r = v.begin(); r != v.end(); r++) add(r->first, r->second);
  }
  V query(V x) {
    int L = -1, R = Q.size() - 1;
    while (R - L > 1) {
      int M = (L + R) / 2;
      (0 ^ ((calc(Q[M], x) <= calc(Q[M + 1], x))) ? L : R) = M;
    }
    return calc(Q[R], x);
  }
};
ConvexHull<double> CHL, CHR;
bool cmp(pair<signed long long, signed long long> L,
         pair<signed long long, signed long long> R) {
  return L.first * R.second < R.first * L.second;
}
void solve() {
  int i, j, k, l, r, x, y;
  string s;
  cin >> N;
  for (i = 0; i < (N); i++) cin >> XL[i] >> XR[i] >> Y[i];
  P.push_back({0, 1});
  for (i = 0; i < (N); i++)
    for (j = 0; j < (N); j++)
      if (Y[i] < Y[j]) {
        P.push_back({XR[j] - XL[i], Y[j] - Y[i]});
        P.push_back({XL[j] - XR[i], Y[j] - Y[i]});
      }
  sort((P.begin()), (P.end()), cmp);
  P.erase(unique((P.begin()), (P.end())), P.end());
  for (i = 0; i < (N); i++)
    for (j = 0; j < (N); j++)
      if (Y[i] < Y[j]) {
        pair<signed long long, signed long long> a = {XR[j] - XL[i],
                                                      Y[j] - Y[i]};
        x = lower_bound((P.begin()), (P.end()), a, cmp) - P.begin();
        a = {XL[j] - XR[i], Y[j] - Y[i]};
        y = lower_bound((P.begin()), (P.end()), a, cmp) - P.begin();
        rem[y + 1]++;
        rem[x]--;
      }
  vector<pair<double, double>> LC, RC;
  for (i = 0; i < (N); i++) {
    LC.push_back({Y[i], -XL[i]});
    RC.push_back({-Y[i], XR[i]});
  }
  CHL.add(LC);
  CHR.add(RC);
  mi = 1e19;
  for (i = 0; i < (P.size()); i++) {
    if (i) rem[i] += rem[i - 1];
    if (rem[i]) continue;
    double a = 1.0 * P[i].first / P[i].second;
    mi = min(mi, CHR.query(a) + CHL.query(a));
  }
  (void)printf("%.12lf\n", (double)mi);
}
int main(int argc, char** argv) {
  string s;
  int i;
  if (argc == 1) ios::sync_with_stdio(false), cin.tie(0);
  for (i = 0; i < (argc - 1); i++) s += argv[i + 1], s += '\n';
  for (i = 0; i < (s.size()); i++) ungetc(s[s.size() - 1 - i], stdin);
  cout.tie(0);
  solve();
  return 0;
}
