//2021/12/11
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <climits>//need "INT_MAX","INT_MIN"
#include <cstring>//need "memset"
#include <cmath>
#include <algorithm>
#define enter() putchar(10)
#define debug(c,que) cerr<<#c<<" = "<<c<<que
#define cek(c) puts(c)
#define blow(arr,st,ed,w) for(register int i=(st);i<=(ed);i++)cout<<arr[i]<<w;
#define speed_up() cin.tie(0),cout.tie(0)
#define endl "\n"
#define Input_Int(n,a) for(register int i=1;i<=n;i++)scanf("%d",a+i);
#define Input_Long(n,a) for(register long long i=1;i<=n;i++)scanf("%lld",a+i);
#define mst(a,k) memset(a,k,sizeof(a))
namespace Newstd
{
inline int read()
{
int x=0,k=1;
char ch=getchar();
while(ch<'0' || ch>'9')
{
if(ch=='-')
{
k=-1;
}
ch=getchar();
}
while(ch>='0' && ch<='9')
{
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*k;
}
inline void write(int x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9)
{
write(x/10);
}
putchar(x%10+'0');
}
}
using namespace Newstd;
using namespace std;
const int ma=1005;
struct Node
{
int x;
int y;
double dis;
};
Node node[ma*ma],tr[ma*ma];
int fa[ma];
int n,k;
int idx;
inline double dist(int a,int b)
{
return sqrt(pow((node[a].x-node[b].x),2)+pow((node[a].y-node[b].y),2));
}
inline void init()
{
for(register int i=1;i<=n;i++)
{
fa[i]=i;
}
}
inline int getf(int x)
{
if(fa[x]==x)
{
return x;
}
return fa[x]=getf(fa[x]);
}
inline void merge(int x,int y)
{
int f1=getf(x),f2=getf(y);
if(f1!=f2)
{
fa[f1]=f2;
}
}
inline void Kruskal()
{
int sum=0;
for(register int i=1;i<=idx;i++)
{
if(sum==n-k)
{
printf("%.2lf\n",tr[i].dis);
return;
}
if(getf(tr[i].x)!=getf(tr[i].y))
{
merge(tr[i].x,tr[i].y);
sum++;
}
}
}
int main(void)
{
n=read(),k=read();
for(register int i=1;i<=n;i++)
{
node[i].x=read(),node[i].y=read();
}
for(register int i=1;i<=n;i++)
{
for(register int j=1;j<i;j++)
{
tr[++idx].x=i,tr[idx].y=j,tr[idx].dis=dist(i,j);
}
}
init();
sort(tr+1,tr+idx+1,[](Node x,Node y)mutable
{
return x.dis<y.dis;
});
Kruskal();
return 0;
}