#include <bits/stdc++.h>
using namespace std;
typedef complex<double> Point;
#define LE(n,m) ((n)<(m)+EPS)
#define GE(n,m) ((n)+EPS>(m))
#define EQ(n,m) (abs((n)-(m))<EPS)
const double EPS=1e-8;
struct Circle{Point center; double r;};

vector<Point> crosspointCC(const Circle &c1,const Circle &c2){
    vector<Point> ps;
    Point ls=c2.center-c1.center;
    double dist=abs(ls);
    double crL=(norm(ls)+c1.r*c1.r-c2.r*c2.r)/(2.0*dist);
    if (EQ(dist,0)||c1.r<abs(crL)) return ps;
    Point dir=ls*Point(0.0,sqrt(c1.r*c1.r-crL*crL)/dist);
    Point mc=c1.center+crL/dist*ls;
    ps.emplace_back(mc+dir);
    if (!EQ(norm(dir),0.0)) ps.emplace_back(mc-dir);
    return ps;
}

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);
    int N,K; cin >> N >> K;
    vector<Point> ps;
    vector<double> cs;
    for (int i=0;i<N;++i){
        double x,y,c; cin >> x >> y >> c;
        ps.emplace_back(x,y);
        cs.emplace_back(c);
    }
    double lb=0,ub=1e9;
    while(ub-lb>1e-7){
        double mid=(ub+lb)/2.0;
        vector<Point> cand;
        vector<Circle> checks;
        for (int i=0;i<N;++i){
            Circle C={ps[i],mid/cs[i]};
            checks.emplace_back(C);
        }
        for (int i=0;i<N;++i){
            cand.emplace_back(ps[i]);
            for (int j=i+1;j<N;++j){
                vector<Point> cps=crosspointCC(checks[i],checks[j]);
                for (Point p:cps) cand.emplace_back(p);
            }
        }
        int ok=0;
        for (Point p:cand){
            int cnt=0;
            for (int i=0;i<N;++i)
                if (LE(abs(p-checks[i].center),checks[i].r))
                    ++cnt;
            if (cnt>=K) ok=1;
        }
        (ok?ub:lb)=mid;
    }
    cout << ub << '\n';
}