#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
const double EPS = 1e-10;
const double INF = 1e+10;
const double PI = acos(-1);
int sig(double r) { return (r < -EPS) ? -1 : (r > +EPS) ? +1 : 0; }
struct Pt {
	double x, y;
	Pt() {}
	Pt(double x, double y) : x(x), y(y) {}
	Pt operator+(const Pt &a) const { return Pt(x + a.x, y + a.y); }
	Pt operator-(const Pt &a) const { return Pt(x - a.x, y - a.y); }
	Pt operator*(const Pt &a) const { return Pt(x * a.x - y * a.y, x * a.y + y * a.x); }
	Pt operator-() const { return Pt(-x, -y); }
	Pt operator*(const double &k) const { return Pt(x * k, y * k); }
	Pt operator/(const double &k) const { return Pt(x / k, y / k); }
	double abs() const { return sqrt(x * x + y * y); }
	double abs2() const { return x * x + y * y; }
	double arg() const { return atan2(y, x); }
	double dot(const Pt &a) const { return x * a.x + y * a.y; }
	double det(const Pt &a) const { return x * a.y - y * a.x; }
};
double tri(const Pt &a, const Pt &b, const Pt &c) { return (b - a).det(c - a); }
int iSP(Pt a, Pt b, Pt c) {
	int s = sig((b - a).det(c - a));
	if (s) return s;
	if (sig((b - a).dot(c - a)) < 0) return -2; // c-a-b
	if (sig((a - b).dot(c - b)) < 0) return +2; // a-b-c
	return 0;
}
bool iSS(Pt a, Pt b, Pt c, Pt d) {
	return (iSP(a, b, c) * iSP(a, b, d) <= 0 && iSP(c, d, a) * iSP(c, d, b) <= 0);
}
int ax[1100];int ay[1100];int bx[1100];int by[1100];
double ijk[1100];
int v[1100];
int main(){
	int a,b;scanf("%d%d",&a,&b);
	for(int i=0;i<a;i++){
		scanf("%d%d",ax+i,ay+i);
	}
	for(int i=0;i<b;i++)scanf("%d%d",bx+i,by+i);
	for(int i=0;i<a;i++)ijk[i]=999999999;
	ijk[0]=0;
	for(int i=0;i<a;i++){
		int at=0;
		double val=999999999;
		for(int j=0;j<a;j++)if(!v[j]&&val>ijk[j]){
			at=j;val=ijk[j];
		}
		v[at]=1;
		for(int j=0;j<a;j++){
			if(iSS(Pt(bx[0],by[0]),Pt(bx[1],by[1]),Pt(ax[at],ay[at]),Pt(ax[j],ay[j])))continue;
			ijk[j]=min(ijk[j],ijk[at]+sqrt((ax[at]-ax[j])*(ax[at]-ax[j])+(ay[at]-ay[j])*(ay[at]-ay[j])));
		}
	}
	double ret=ijk[1]+sqrt((bx[0]-bx[1])*(bx[0]-bx[1])+(by[0]-by[1])*(by[0]-by[1]));
	for(int i=0;i<b;i++)ijk[i]=999999999;
	ijk[0]=0;
	for(int i=0;i<b;i++)v[i]=0;
	for(int i=0;i<b;i++){
		int at=0;
		double val=999999999;
		for(int j=0;j<b;j++)if(!v[j]&&val>ijk[j]){
			at=j;val=ijk[j];
		}
		v[at]=1;
		for(int j=0;j<b;j++){
			if(iSS(Pt(ax[0],ay[0]),Pt(ax[1],ay[1]),Pt(bx[at],by[at]),Pt(bx[j],by[j])))continue;
			ijk[j]=min(ijk[j],ijk[at]+sqrt((bx[at]-bx[j])*(bx[at]-bx[j])+(by[at]-by[j])*(by[at]-by[j])));
		}
	}
	ret=min(ret,ijk[1]+sqrt((ax[0]-ax[1])*(ax[0]-ax[1])+(ay[0]-ay[1])*(ay[0]-ay[1])));
	if(ret>909090909)printf("-1\n");
	else printf("%.12f\n",ret);
	
}