#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+7;
struct node{
int x,y;
double val;
}edge[maxn*3];
double dist(int x,int xxx,int y,int yyy){
return (double)sqrt((x-xxx)*(x-xxx)*1.0+(y-yyy)*(y-yyy)*1.0);
}
bool cmp(node a,node b){
return a.val<b.val;
}
int fa[maxn];
int get(int x){
if(x==fa[x]) return x;
else return fa[x]=get(fa[x]);
}
int xx[maxn],yy[maxn];
int n,k,cnt;
void kruskal(){
int tot=0;
for(int i=1;i<=cnt;i++){
int f1=get(edge[i].x);
int f2=get(edge[i].y);
if(f1!=f2){
fa[f1]=f2;
tot++;
if(tot==n-k) break;
}
}
for(int i=n-k+1;i<=cnt;i++){
if(get(edge[i].x)!=get(edge[i].y)){
printf("%.2lf\n",edge[i].val);
break;
}
}
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=n;i++){
scanf("%d%d",&xx[i],&yy[i]);
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
edge[++cnt].x=i;
edge[cnt].y=j;
edge[cnt].val=dist(xx[i],xx[j],yy[i],yy[j]);
}
}
sort(edge+1,edge+1+cnt,cmp);
kruskal();
return 0;
}