#include<bits/stdc++.h>
#define int long long
// #define double long double
const int N=20;
double f[1<<N][N];
int n;
double d;
int a[N],b[N];
int c[N][N];
double dis[N][N];
double ans=1e9;
int mul(int x){
return x*x;
}
int diss(int x1,int y1,int x2,int y2){
return mul(x1-x2)+mul(y1-y2);
}
void solve(){
std::cin>>n>>d;
for(int i=0;i<n;i++){
std::cin>>a[i]>>b[i];
}
memset(f,0x7f,sizeof f);
memset(dis,0x7f,sizeof dis);
for(int i=0;i<n;i++){
dis[i][i]=0.0;
for(int j=0;j<n;j++){
double t=sqrtl(diss(a[i],b[i],a[j],b[j]));
if(t<=d)dis[i][j]=t;
}
}
for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
dis[i][j]=std::min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
f[1][0]=0.0;
for(int i=1;i<(1<<n);i++){
for(int j=0;j<n;j++){
if(i&(1<<j)){
for(int k=0;k<n;k++){
if(k!=j && (i&(1<<k)) ){
f[i][j]=std::min(f[i][j],f[i-(1<<j)][k]+dis[j][k]);
}
}
}
}
}
for(int i=0;i<n;i++){
ans=std::min(ans,f[(1<<n)-1][i]+dis[i][0]);
}
std::cout<<ans;
}
signed main(){
std::ios::sync_with_stdio(0);
std::cin.tie(0);std::cout.tie(0);
std::cout<<std::fixed<<std::setprecision(2);
int _=1;
//std::cin>>_;
while(_--)solve();
}
if(k!=j && (i&(1<<k)) && dis[j][k]<=d) 在我判断转移条件中多了一句dis[j][k]<=d就变成90,删掉就是100?