#include<iostream>
#include<string>
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#include<functional>
#include<iomanip>
#include<queue>
#include<ciso646>
#include<random>
#include<map>
#include<set>
#include<complex>
#include<bitset>
#include<stack>
#include<unordered_map>
#include<utility>
#include<cassert>
using namespace std;

typedef long long ll;

typedef unsigned long long ul;
typedef unsigned int ui;
const ll mod = 998244353;
typedef long double ld;
typedef complex<ld> Point;
const ll INF = mod * mod;
typedef pair<int, int> P;
#define stop char nyaa;cin>>nyaa;
#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define Rep(i,sta,n) for(int i=sta;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define per1(i,n) for(int i=n;i>=1;i--)
#define Rep1(i,sta,n) for(int i=sta;i<=n;i++)
const ld eps = 1e-8;
const ld pi = acos(-1.0);
typedef pair<ld, ld> LDP;
typedef pair<ll, ll> LP;
typedef vector<int> vec;
typedef vector<string> svec;

bool eq(ld a, ld b) {
	return (abs(a - b) < eps);
}

class Line {
public:
	Point a, b;
};
class Circle {
public:
	Point p; ld r;
};

ld dot(Point a, Point b) {
	return real(conj(a)*b);
}
ld cross(Point a, Point b) {
	return imag(conj(a)*b);
}
Point proj(Line l, Point p) {
	ld t = dot(p - l.a, l.a - l.b) / norm(l.a - l.b);
	return l.a + t * (l.a - l.b);
}
ld dist_lp(Line l, Point p) {
	return abs(p - proj(l, p));
}

int ccw(Point a, Point b, Point c) {
	b -= a; c -= a;
	if (cross(b, c) > eps)return 1;//a,b,cが反時計回り
	if (cross(b, c) < -eps)return -1;//a,b,cが時計回り
	if (dot(b, c) < 0)return 2;//c,a,bの順に一直線
	if (norm(b) < norm(c))return -2;//a,b,cの順に一直線
	return 0;//a,c,bの順に一直線
}
bool isis_ll(Line l, Line m) {
	return !eq(cross(l.b - l.a, m.b - m.a), 0);
}
Point is_ll(Line s, Line t) {
	Point sv = s.b - s.a; Point tv = t.b - t.a;
	return s.a + sv * cross(tv, t.a - s.a) / cross(tv, sv);
}

//counterclockwise
struct polygon {
private:
	vector<Point> p;
public:
	polygon(vector<Point> &v) {
		p = v;
	}
	//f=true:left-side
	void convex_cut(Line &l) {
		vector<Point> nex;
		rep(i, p.size()) {
			Point a = p[i], b = p[(i + 1) % p.size()];
			if (ccw(l.a, l.b, a) != -1)nex.push_back(a);
			if (ccw(l.a,l.b,a)*ccw(l.a,l.b,b)<0) {
				nex.push_back(is_ll({ a,b }, l));
			}
		}
		p = nex;
	}
	bool query() {
		return p.size();
	}
};

vector<Point> is_cc(Circle c1, Circle c2) {
	vector<Point> res;
	ld d = abs(c1.p - c2.p);
	ld rc = (d*d + c1.r*c1.r - c2.r*c2.r) / (2 * d);
	ld dfr = c1.r*c1.r - rc * rc;
	if (abs(dfr) < eps)dfr = 0.0;
	if (dfr < 0.0)return res;
	ld rs = sqrt(dfr);
	Point diff = (c2.p - c1.p) / d;
	res.push_back(c1.p + diff * Point(rc, rs));
	if (dfr != 0.0)res.push_back(c1.p + diff * Point(rc, -rs));
	return res;
}
bool in_Circle(Circle a, Circle b) {
	ld dist = abs(b.p - a.p);
	return dist < b.r - a.r+eps;
}

int n;
void solve() {
	vector<Point> v(n);
	vector<ld> d(n);
	rep(i, n) {
		ld a, b; cin >> a >> b;
		v[i] = { a,b };
		cin >> d[i];
	}
	ld le = 0, ri = 1000;
	rep(aa, 100) {
		ld mid = (le + ri) / 2.0;
		vector<Circle> c(n);
		rep(i, n) {
			c[i] = { v[i],mid * d[i] };
		}
		//cout << "hello "<<mid << endl;
		bool g = false;
		rep(i,n) {
			bool f = true;
			int cnt = 0;
			vector<pair<ld, int>> u;
			int z = n - 1;
			bool pass = false;
			rep(j, n) {
				if (i == j)continue;
				if (in_Circle(c[i], c[j])) {
					z--; continue;
				}
				else if (in_Circle(c[j], c[i])) {
					pass = true; break;
				}
				vector<Point> sc = is_cc(c[i], c[j]);
				if (sc.size() < 2) {
					f = false; break;
				}
				ld t1 = arg(sc[0] - c[i].p);
				ld t2 = arg(sc[1] - c[i].p);
				u.push_back({ t1,0 });
				u.push_back({ t2,1 });
				if (t1 < t2)cnt++;
				if (i == 0) {
					//cout << sc[1] << " " << sc[0] << endl;
					//cout << t2 << " " << t1 << endl;
				}
			}
			if (pass)continue;
			if (f) {
				f = false;
				sort(u.begin(), u.end());
				if (cnt == z)f = true;
				rep(k, u.size()) {
					if (u[k].second)cnt++;
					else cnt--;
					if (cnt == z)f = true;
				}
			}
			if (f)g = true;
		}
		if (g)ri = mid;
		else le = mid;
	}
	cout << le << endl;
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout << fixed << setprecision(9);
	while (cin >> n, n) {
		solve();
	}
	//solve();
	//stop
	return 0;
}



Measured memory_bytes: 3344