#include <iostream>
#include <vector>
#include <complex>
#include <cstdio>
#include <algorithm>
#define rep(i, n) for(i = 0; i < n; i++)
using namespace std;
typedef complex<double> Point;

//円と円の交点. 接する場合も空のvectorを返す.
vector<Point> kouten_CC(Point c1, double r1, Point c2, double r2) {
	Point r = c2 - c1;
	if (norm(r) >= (r1 + r2) * (r1 + r2)) { return vector<Point>(); }
	if (min(r1, r2) + abs(r) <= max(r1, r2)) { return vector<Point>(); }
	double theta = acos((norm(r) + r1 * r1 - r2 * r2) / (2 * r1 * abs(r)));
	Point R = (r1 / abs(r)) * r;
	Point res1 = R * exp(Point(0, 1) * theta);
	Point res2 = R * exp(Point(0, 1) * (-theta));
	vector<Point> ret;
	ret.push_back(c1 + res1);
	ret.push_back(c1 + res2);
	return ret;
}

int n, K;
double x[60], y[60], c[60];

//答えがA以下か？
bool check(double A) {
	double r[60];
	int i, j, k;
	
	rep(i, n) r[i] = A / c[i];
	
	vector<Point> ps;
	rep(i, n) {
		ps.push_back(Point(x[i], y[i]));
		for (j = i + 1; j < n; j++) {
			ps.push_back((Point(x[i], y[i]) + Point(x[j], y[j])) * (double)0.5);
			vector<Point> p = kouten_CC(Point(x[i], y[i]), r[i], Point(x[j], y[j]), r[j]);
			rep(k, p.size()) {
				ps.push_back(p[k]);
				//cout << p[k] << endl;
			}
			if (p.size() == 2) {
				ps.push_back((p[0] + p[1]) * (double)0.5);
			}
		}
	}
	
	//交点ps[i]がK個以上の円に含まれるか判定.
	//誤差が無い場合、円jが交点ps[i]をギリギリ含むことがある。
	//誤差が無い場合、解hを小さくすることで誤魔化すのは難しい。(交点しか見ないため）
	//そこで、円jを少しだけ大きくしておいて判定する。
	double EPS = 1e-11;
	rep(i, n) r[i] += EPS;
	rep(i, ps.size()) {
		int cnt = 0;
		rep(j, n) {
			Point diff = Point(x[j], y[j]) - ps[i];
			if (abs(diff) <= r[j]) cnt++;
		}
		if (cnt >= K) return true;
	}
	return false;
}

int main() {
	int i;
	
	cin >> n >> K;
	rep(i, n) {
		cin >> x[i] >> y[i] >> c[i];
	}
	
	double st = 0, ed = 1e+7, mid;
	for (i = 0; i < 100; i++) {
		mid = (st + ed) / 2;
		if (check(mid)) { ed = mid; }
		else { st = mid; }
	}
	printf("%.14f\n", ed);
	return 0;
}