#include <bits/stdc++.h>
#define int long long
#define H 19260817
#define rint register int
#define For(i,l,r) for(rint i=l;i<=r;++i)
#define FOR(i,r,l) for(rint i=r;i>=l;--i)
#define MOD 1000003
#define mod 1000000007
using namespace std;
inline int read() {
rint x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
void print(int x){
if(x<0){putchar('-');x=-x;}
if(x>9){print(x/10);putchar(x%10+'0');}
else putchar(x+'0');
return;
}
const int N = 13, M = 6;
struct Node {
double x, y;
int f;
} a[N+M];
int n, m, k, w[N*M];
double dp[N+M][1<<N][1<<M], ans = 0x3f3f3f3f3f3f3f3f;
double dis(double x1, double y1, double x2, double y2) {
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
int lb(int x) {
return x & -x;
}
signed main() {
n = read(), m = read();
for (int i = 0; i < 64; i++) {
int x = i;
for (; x; x -= lb(x)) w[i]++;
}
For(i,0,n-1) a[k++] = (Node) {read(), read(), 0};
For(i,0,m-1) a[k++] = (Node) {read(), read(), 1};
memset(dp, 0x3f, sizeof dp);
for (int S1 = 0; S1 < (1<<n); S1++) {
for (int S2 = 0; S2 < (1<<m); S2++) {
for (int i = 0; i < k; i++) {
for (int j = 0; j < k; j++) {
if(i == j) continue;
if((a[j].f == 0) && S1 >> i & 1 == 1 && S1 >> j & 1 == 0)
dp[i][S1|(1<<j)][S2] = min(dp[i][S1|(1<<j)][S2], dp[j][S1][S2] + dis(a[i].x, a[i].y, a[j].x, a[j].y) / w[S2]);
if((a[j].f == 1) && S2 >> i & 1 == 1 && S2 >> j & 1 == 0)
dp[i][S1][S2|(1<<j)] = min(dp[i][S1][S2|(1<<j)], dp[j][S1][S2] + dis(a[i].x, a[i].y, a[j].x, a[j].y) / w[S2]);
}
}
}
}
for (int S2 = 0; S2 < (1<<m); S2++) {
for (int i = 0; i < k; i++) {
ans = min(ans, dp[i][(1<<n)-1][S2] + dis(0, 0, a[i].x, a[i].y) / w[S2]);
}
}
printf("%.10lf\n", ans);
return 0;
}