#include <bits/stdc++.h>
int read(void) {
  int res = 0, sign = 1;
  char ch = std::getchar();
  while (!std::isdigit(ch)) {
    if (ch == '-') sign = -1;
    ch = std::getchar();
  }
  while (std::isdigit(ch)) res = res * 10 + ch - 48, ch = std::getchar();
  return sign * res;
}
const double EPS = 1e-9;
const int MAXN = 2e3 + 19;
struct Line {
  int l, r, y;
} line[MAXN];
int n;
std::set<double> able;
std::vector<double> v;
std::vector<std::pair<double, int> > e;
double get(double b) {
  double mx = -1e18, mn = 1e18;
  for (int i = 1; i <= n; ++i)
    mx = std::max(mx, line[i].r + line[i].y * b),
    mn = std::min(mn, line[i].l + line[i].y * b);
  return mx - mn;
}
int main() {
  n = read();
  for (int i = 1; i <= n; ++i)
    line[i].l = read(), line[i].r = read(), line[i].y = read();
  for (int i = 1; i < n; ++i)
    for (int j = i + 1; j <= n; ++j)
      if (line[i].y != line[j].y) {
        double low =
            -double(line[i].l - line[j].r) / double(line[i].y - line[j].y);
        double upp =
            -double(line[i].r - line[j].l) / double(line[i].y - line[j].y);
        if (low > upp) std::swap(low, upp);
        e.push_back({low + EPS, -1}), e.push_back({upp - EPS, 1});
      }
  std::sort(e.begin(), e.end());
  int g = 0;
  for (auto i : e) {
    if (g == 0)
      v.push_back(i.first);
    else if (g == -1 && i.second == 1)
      v.push_back(i.first);
    g += i.second;
  }
  if (v.empty()) v.push_back(0);
  int l = 0, r = v.size() - 1;
  while (r - l > 2) {
    int m1 = l + (r - l) / 3, m2 = r - (r - l) / 3;
    if (get(v[m2]) < get(v[m1]))
      l = m1;
    else
      r = m2;
  }
  double ans = 1e18;
  for (int i = l; i <= r; ++i) ans = std::min(ans, get(v[i]));
  std::printf("%.8f\n", ans);
  return 0;
}
