#include <iostream>
#include <set>
#include <map>
#include <vector>
#include <cstdio>
#include <cmath>
#define llint long long
#define eps 1e-9

using namespace std;

struct vec2d{
	double x, y;
	vec2d(){}
	vec2d(double x, double y){
		this->x = x, this->y = y;
	}
	double add(double a, double b){
		if(fabs(a+b) < eps * (fabs(a) + fabs(b))) return 0.0;
		return a+b;
	}
	vec2d operator+(vec2d ope){
		return vec2d(add(x, ope.x), add(y, ope.y));
	}
	vec2d operator-(vec2d ope){
		return vec2d(add(x, -ope.x), add(y, -ope.y));
	}
	vec2d operator*(double t){
		return vec2d(x*t, y*t);
	}
	vec2d operator/(double t){
		return vec2d(x/t, y/t);
	}
	double dot(vec2d ope){
		return add(x*ope.x, y*ope.y);
	}
	double cross(vec2d ope){
		return add(x*ope.y, -y*ope.x);
	}
	double norm(){
		double d2 = dot(*this);
		if(d2 > 0) return sqrt(d2);
		return 0.0;
	}
};

llint n, k;
vec2d p[65]; 
double c[65], r[65];

double distPP(vec2d p, vec2d q){
	return (p-q).norm();
}

double distSP(vec2d p, vec2d q, vec2d x)
{
	if((x-p).dot(q-p) <= 0) return distPP(p, x);
	if((x-q).dot(p-q) <= 0) return distPP(q, x);
	return fabs( (x-p).cross(q-p) / distPP(p, q) );
}

bool isOnS(vec2d p, vec2d q, vec2d x)
{
	return (p-x).cross(q-x) == 0 && (p-x).dot(q-x) <= 0;
}

bool isCrossSS(vec2d p, vec2d q, vec2d r, vec2d s)
{
	if((q-p).cross(s-r) == 0){
		return isOnS(p, q, r) || isOnS(p, q, s) || isOnS(r, s, p) || isOnS(r, s, q);	
	}
	double t = (r-p).cross(s-r) / (q-p).cross(s-r);
	vec2d x = p + (q-p)*t;
	return isOnS(p, q, x) && isOnS(r, s, x);
}

double distSS(vec2d p, vec2d q, vec2d r, vec2d s)
{
	if(isCrossSS(p, q, r, s)) return 0;
	double ret = distSP(p, q, r);
	ret = min(ret, distSP(p, q, s));
	ret = min(ret, distSP(r, s, p));
	ret = min(ret, distSP(r, s, q));
	return ret;
}

bool getCrossPointLL(vec2d p, vec2d q, vec2d r, vec2d s, vec2d &dest) //returns false if two lines are parallel.
{
	if((q-p).cross(s-r) == 0) return false;
	double t = (r-p).cross(s-r) / (q-p).cross(s-r);
	dest = p + (q-p)*t;
	return true;
}

void getCrossPointCC(vec2d c1, double r1, vec2d c2, double r2, vec2d &lp, vec2d &rp)
{
  vec2d v = c2 - c1, n;
  double d = v.norm();
  double x = (r1*r1-r2*r2+d*d)/(2*d);
 
  v = v * (x/d);
  n = vec2d(-v.y, v.x);
  if(x >= 0){
    n = n * (sqrt(r1*r1-x*x) / n.norm());
    lp = c1 + v - n, rp = c1 + v + n;
  }
  else{
    n = n * (sqrt(r2*r2-(d-x)*(d-x))) / n.norm();
    lp = c1 + v + n, rp = c1 + v - n;
  }
}

llint count(vec2d &v, int i, int j)
{
	llint ret = 0;
	for(int l = 1; l <= n; l++){
		if(i == l || j == l){
			ret++;
			continue;
		}
		if(distPP(p[l], v) <= r[l]) ret++;
	}
	return ret;
}

bool check(double x)
{
	for(int i = 1; i <= n; i++) r[i] = x / c[i];
	for(int i = 1; i <= n; i++){
		if(count(p[i], 0, 0) >= k) return true;
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			if(i >= j) continue;
			double d = distPP(p[i], p[j]);
			if(d > r[i] + r[j]) continue;
			if(d < fabs(r[i] - r[j])) continue;
			vec2d u, v;
			getCrossPointCC(p[i], r[i], p[j], r[j], u, v);
			if(count(u, i, j) >= k) return true;
			if(count(v, i, j) >= k) return true;
		}
	}
	return false;
}


int main(void)
{
	//ios::sync_with_stdio(0);
	//cin.tie(0);
	
	cin >> n >> k;
	for(int i = 1; i <= n; i++){
		cin >> p[i].x >> p[i].y >> c[i];
	}
	
	if(k == 1){
		printf("%.11f\n", 0.0);
		return 0;
	}
	
	double ub = 1e18, lb = 0, mid;
	for(int i = 0; i < 100; i++){
		mid = (ub+lb)/2;
		if(check(mid)) ub = mid;
		else lb = mid;
	}
	printf("%.11f\n", ub);
	
	return 0;
}

Measured memory_bytes: 256