Problem: Problem

KND is a student programmer at the University of Aizu. He is known to be a sweet tooth. He will be staying in a city for a year and wants to visit all N sweets shops in the city during that time. So I think the best place to live for the past year is the best place to go around the sweets shop. As his neighbor, you have to find a place that minimizes the worst travel time to each sweets shop. The city where this sweets shop is located is represented by a two-dimensional plane for the sake of simplicity. He travels a different distance per unit time depending on his motivation for the desired sweets shop. He also intends to live anywhere (even in the same place as the sweets shop). KND is uncompromising when it comes to sweetness.

Constraints

The input satisfies the following conditions.

* All inputs are integers.
* 2 ≤ N ≤ 100
* 0 ≤ xi, yi ≤ 100
* 1 ≤ vi ≤ 100 (1 ≤ i ≤ N)
* xi ≠ xj or yi ≠ yj (where 1 ≤ i <j ≤ N)

Input

The input consists of multiple test cases. One test case is given in the following format. Indicates the end of input when N = 0.


N
x1 y1 v1
x2 y2 v2
...
xN yN vN


here,

* N: Number of sweets shops
* xi: x-coordinate of the i-th sweetener
* yi: y coordinate of the i-th sweets shop
* vi: Distance traveled per unit time when moving to the i-th sweets shop



Is.

Output

Output the minimum travel time for each test case on one line. This value should not differ more than 10-5 from the value of the judge output.

Example

Input

2
1 1 1
2 2 1
4
1 1 3
3 1 3
4 2 1
1 5 3
0


Output

0.70710678
1.06066017

Solution (in CPP):

Solution:
#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;
}