Problem:
Score : 600 points

Problem Statement

Takahashi wants to grill N pieces of meat on a grilling net, which can be seen as a two-dimensional plane. The coordinates of the i-th piece of meat are \left(x_i, y_i\right), and its hardness is c_i.

Takahashi can use one heat source to grill the meat. If he puts the heat source at coordinates \left(X, Y\right), where X and Y are real numbers, the i-th piece of meat will be ready to eat in c_i \times \sqrt{\left(X - x_i\right)^2 + \left(Y-y_i\right)^2} seconds.

Takahashi wants to eat K pieces of meat. Find the time required to have K or more pieces of meat ready if he put the heat source to minimize this time.

Constraints

All values in input are integers.

1 \leq N \leq 60

1 \leq K \leq N

-1000 \leq x_i , y_i \leq 1000

\left(x_i, y_i\right) \neq \left(x_j, y_j\right) \left(i \neq j \right)

1 \leq c_i \leq 100

Input

Input is given from Standard Input in the following format:

N K
x_1 y_1 c_1
\vdots
x_N y_N c_N

Output

Print the answer.

It will be considered correct if its absolute or relative error from our answer is at most 10^{-6}.

Sample Input 1

4 3
-1 0 3
0 0 3
1 0 2
1 1 40

Sample Output 1

2.4

If we put the heat source at \left(-0.2, 0\right), the 1-st, 2-nd, and 3-rd pieces of meat will be ready to eat within 2.4 seconds. This is the optimal place to put the heat source.

Sample Input 2

10 5
-879 981 26
890 -406 81
512 859 97
362 -955 25
128 553 17
-885 763 2
449 310 57
-656 -204 11
-270 76 40
184 170 16

Sample Output 2

7411.2252

Solution in C++14 (Clang 3.8.0) (judge verdict: Wrong Answer)

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
#include <string>
#include <queue>
#include <unordered_map>
#include <iterator>
#include <stack>
#include <unordered_set>
#include <iomanip>
#include <ctime>
#include <cstring>
#include <bitset>

#include <random>

using namespace std;
void dout() { cerr << endl; }
typedef long long ll;
template <typename Head, typename... Tail>
void dout(Head H, Tail... T) {
    cerr << H << ' ';
    dout(T...);
}

using ll = long long;
using pii = pair<ll, ll>;
using ld = long double;
using pll = pair<long long, long long>;

void precalc() {}

//#define solvsh
//#define multi

#ifdef solvsh

void solve() {

}

#else
typedef vector<int> vi;
#define INF 0x3f3f3f3f
#define FOR(i, n) for(int i = 0; i < n; i++)
template<class T>
T rnd(T l,T r){	//[l,r)
    using D = uniform_int_distribution<T>;
    static random_device rd;
    static mt19937 gen(rd());
    return D(l,r-1)(gen);
}
const int MAXN = 1000;

int n;
int k;
ld eps = 1e-6;
ld coef[MAXN];
pair<ld, ld> pts[MAXN];

ld ff(ld x, ld y) {
    vector<ld> times;
    for (int i = 0; i < n; ++i) {
        ld dx = abs(x - pts[i].first);
        ld dy = abs(y - pts[i].second);
        times.push_back(coef[i] * sqrt(dx * dx + dy * dy));
    }

    sort(times.begin(), times.end());

    return times[k - 1];
}

vector<ld > xx;
vector<ld > yy;

ld calc2(ld x, ld left, ld right){

    while (true){

        ld ml = (2 * left + right) / 3;
        ld mr = (left + 2 * right) / 3;

        ld vall = ff(x, ml);
        ld valr = ff(x, mr);

        if (vall > valr){
            left = ml;
        } else {
            right = mr;
        }
        if (abs(left - right) < eps)
            break;
    }

    return ff(x, (left + right) / 2);
}

ld f(ld x){
    ld answr = 1e18;
    for (int i = 0; i < n - 1; ++ i){
        answr = min(answr, calc2(x, yy[i], yy[i + 1]));
    }

    return answr;
}


ld calc(ld left, ld right){
    while (true){

        ld ml = (2 * left + right) / 3;
        ld mr = (left + 2 * right) / 3;

        ld vall = f(ml);
        ld valr = f(mr);

        if (vall > valr){
            left = ml;
        } else {
            right = mr;
        }

        if (abs(left - right) < eps)
            break;
    }

    return f((left + right) / 2);
}

void solve() {
    cin >> n;
    cin >> k;


    for (int i = 0 ; i < n; ++ i){
        ld x, y, c;
        cin >> x >> y >> c;
        pts[i] = {x, y};
        coef[i] = c;
        xx.push_back(x);
        yy.push_back(y);
    }

    sort(xx.begin(), xx.end());
    sort(yy.begin(), yy.end());

    ld answr = 1e18;

    if (n == 1)
        answr = 0;

    for (int i = 0; i < n - 1; ++ i){
        answr = min(answr, calc(xx[i], xx[i + 1]));
    }

    cout << answr;
}

#endif


void multisolve() {
    int t;
    cin >> t;

    while (t--)
        solve();
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    cout << fixed << setprecision(20);

    precalc();
#ifndef ONLINE_JUDGE
    freopen("../input.in", "r", stdin);
    freopen("../output.out", "w", stdout);
#else
#endif

#ifdef multi
    multisolve();
#else
    solve();
#endif

#ifdef LOCAL
    //cout << '\n' << (double)clock() / CLOCKS_PER_SEC << '\n';
#endif
}