//* Problem  : 1065 - Frontier
//* Contest  : acm.timus.ru
//* Type     : Solution
//* Date     : 2008.06.01
//* Author   : alt
//* Language : C++
//* Compiler : Microsoft Visual C++ 6.0

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

#include <set>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

#define inf 1E100

struct point{
	double x, y;
} a[100], b[2000];

int ok[128][128];

int n, m;
double res;

double tr(double x1, double y1, double x2, double y2, double x3, double y3)
{
	return x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2);
}

int all_left(int k1, int k2)
{
	for (int i = 0; i < m; i++)
	{
		double cross = tr(a[k1].x, a[k1].y, a[k2].x, a[k2].y, b[i].x, b[i].y);
		int k  = (fabs(cross) <= 1E-5 ? 0 : cross > 0 ? 1 : -1);
		if (k >= 0) return 0;
	}
	return 1;
}

double dp[128][128][4];
char fdp[128][128][4];

double len(int k1, int k2)
{
	double dx = a[k1].x - a[k2].x;
	double dy = a[k1].y - a[k2].y;
	return sqrt(dx * dx + dy * dy);
}

double calc(int v, int vn, int d)
{
	if (v == vn) return d ? inf : 0;
	if (!fdp[v][vn][d])
	{
		double res = inf;
		for (int i = v + 1; i <= vn; i++)
			if (ok[v][i])
			{
				double t = len(v, i) + calc(i, vn, d ? d - 1 : 0);
				res = min(t, res);
			}
		fdp[v][vn][d] = 1; dp[v][vn][d] = res;
	}
	return dp[v][vn][d];
}

void solve()
{
	if (!m)
	{
		res = inf;
		for (int i1 = 0; i1 < n; i1++)
			for (int i2 = i1 + 1; i2 < n; i2++)
				for (int i3 = i2 + 1; i3 < n; i3++)
					if (fabs(tr(a[i1].x, a[i1].y, a[i2].x, a[i2].y, a[i3].x, a[i3].y)) > 1E-2)
					{
						double t = len(i1, i2) + len(i2, i3) + len(i1, i3);
						res = min(res, t);
					}
		return;
	}
	if (n == 3)
	{
		for (int i = 0; i < n; i++)
			res += len(i, i + 1);
		return;
	}
	res = inf;
	for (int i = 0; i < 2*n; i++)
		for (int j = i+1; j < min(2 * n, i + n); j++)
			ok[i][j] = all_left(i, j);
/*	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
			printf("%lf [%d] ", len(i, j), ok[i][j]);
		printf("\n");
	}*/
	for (int i = 0; i < n; i++)
	{
		double t = calc(i, i + n, 3);
		res = min(res, t);
	}
}

int main()
{
#ifdef _DEBUG
	freopen("1067", "r", stdin);
#endif
	scanf("%d%d", &n, &m);
	for (int i = 0; i < n; i++)
	{
		scanf("%lf%lf", &a[i].x, &a[i].y); a[i+n] = a[i+n+n] = a[i];
	}
	for (int i = 0; i < m; i++)
		scanf("%lf%lf", &b[i].x, &b[i].y);
	solve();
	printf("%.2lf\n", res);
	return 0;
}