#include <iostream>
#include <fstream>
#include <cassert>
#include <typeinfo>
#include <vector>
#include <stack>
#include <cmath>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <iomanip>
#include <cctype>
#include <random>
#include <complex>
#define syosu(x) fixed<<setprecision(x)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
typedef pair<double,double> pdd;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<char> vc;
typedef vector<vc> vvc;
typedef vector<string> vs;
typedef vector<bool> vb;
typedef vector<vb> vvb;
typedef vector<P> vp;
typedef vector<vp> vvp;
typedef vector<pll> vpll;
typedef pair<P,int> pip;
typedef vector<pip> vip;
const int inf=1<<29;
const ll INF=1ll<<60;
const double pi=acos(-1);
const double eps=1e-8;
const ll mod=1e9+7;
const int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};

typedef complex<double> point;
typedef pair<point,point> pp;
typedef vector<point> VP;
#define x real()
#define y imag()
const point O{0,0};

typedef pair<int,double> T;
typedef pair<double,int> U;
class Graph{
	private:
	int V;
	vector<vector<T> > g;
	public:
	double DIJ(int s,int t){
		priority_queue<U> que;
		vd d(V,inf);
		d[s]=0;
		que.push({0,s});
		while(!que.empty()){
			U p=que.top();
			que.pop();
			int v=p.second;
			if(d[v]<-p.first) continue;
			for(int i=0;i<g[v].size();i++){
				int F=g[v][i].first;
				double S=g[v][i].second;
				if(d[F]>d[v]+S){
					d[F]=d[v]+S;
					que.push({-d[F],F});
				}
			}
		}
		return d[t];
	}
	Graph(int v){
		V=v;
		g=vector<vector<T> >(v);
	}
	void add_edge(int s,int t,double c){
		g[s].push_back({t,c});
		g[t].push_back({s,c});
	}
};

void Point_in(point& p){
	double A,B;
	cin>>A>>B;
	p={A,B};
}

bool If(pp a,pp b){
	point p1=a.first,p2=a.second,q1=b.first,q2=b.second;
	double c=(p1.x-p2.x)*(q1.y-p1.y)+(p1.y-p2.y)*(p1.x-q1.x);
	double d=(p1.x-p2.x)*(q2.y-p1.y)+(p1.y-p2.y)*(p1.x-q2.x);
	return c*d<0;
}

bool Inter(pp a,pp b){
	if(If(a,b)&&If(b,a)) return 1;
	return 0;
}

int n,m;
VP a,b;

double f(){
	Graph g(n);
	for(int i=0;i<n;i++) for(int j=0;j<i;j++) if(!Inter({a[i],a[j]},{b[0],b[1]})){
		g.add_edge(i,j,abs(a[i]-a[j]));
	}
	return g.DIJ(0,1)+abs(b[0]-b[1]);
}

int main(){
	cin>>n>>m;
	a=VP(n);
	b=VP(m);
	for(int i=0;i<n;i++) Point_in(a[i]);
	for(int i=0;i<m;i++) Point_in(b[i]);
	double res=f();
	swap(n,m);
	swap(a,b);
	res=min(res,f());
	if(res>inf-eps) cout<<-1<<endl;
	else cout<<syosu(11)<<res<<endl;
}