Rt
#include <bits/stdc++.h>
using namespace std;
int n, k;
double ans;
vector<pair<int, int> > spot;
struct DSU
{
vector<int> fa;
DSU(int n)
{
fa = vector<int>(n + 1);
for (int i = 0; i <= n; i++)
fa[i] = i;
}
int getRoot(int x)
{
return fa[x] == x ? x : fa[x] = getRoot(fa[x]);
}
void merge(int x, int y)
{
fa[getRoot(x)] = getRoot(y);
}
bool same(int x, int y)
{
return getRoot(x) == getRoot(y);
}
};
struct Edge{
int u, v;
double w;
bool operator < (const Edge & other)const
{
return w < other.w;
}
};
vector<Edge> edges;
vector<Edge> edges2;
void init(int n)
{
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++){
double a = spot[i].first - spot[j].first, b = spot[i].second - spot[j].second;
double dis = sqrt(a * a + b * b);
edges.push_back({i, j, dis});
// printf("%d %d %lf\n", edges[edges.size() - 1].u, edges[edges.size() - 1].v, edges[edges.size() - 1].w);
}
}
int main()
{
scanf("%d %d", &n, &k);
for (int i = 0; i < n; i++){
int x, y;
scanf("%d %d", &x, &y);
spot.push_back(make_pair(x, y));
}
init(n);
// puts("----");
sort(edges.begin(), edges.end());
DSU dsu(n);
for (int i = 0; i < edges.size(); i++)
if (!dsu.same(edges[i].u, edges[i].v)){
// printf("%d %d %lf\n", edges[i].u, edges[i].v, edges[i].w);
dsu.merge(edges[i].u, edges[i].v);
edges2.push_back(edges[i]);
n--;
if(n == k){
printf("%.2f\n", edges[i + 1].w);
break;
}
}
return 0;
}