#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <climits>
#include <ctime>
#include <queue>
#include <stack>
#include <algorithm>
#include <list>
#include <vector>
#include <set>
#include <map>
#include <iostream>
#include <deque>
#include <complex>
#include <string>
#include <iomanip>
#include <sstream>
#include <bitset>
#include <valarray>
#include <iterator>
using namespace std;
typedef long long int ll;
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;

#define REP(i,x) for(int i=0;i<(int)(x);i++)
#define FOR(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();i++)
#define RREP(i,x) for(int i=((int)(x)-1);i>=0;i--)
#define RFOR(i,c) for(__typeof((c).rbegin())i=(c).rbegin();i!=(c).rend();i++)
#define ALL(container) container.begin(), container.end()
#define RALL(container) container.rbegin(), container.rend()
#define SZ(container) ((int)container.size())
#define mp(a,b) make_pair(a, b)
#define UNIQUE(v) v.erase( unique(v.begin(), v.end()), v.end() );

template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }
template<class T> ostream& operator<<(ostream &os, const vector<T> &t) {
os<<"["; FOR(it,t) {if(it!=t.begin()) os<<","; os<<*it;} os<<"]"; return os;
}
template<class T> ostream& operator<<(ostream &os, const set<T> &t) {
os<<"{"; FOR(it,t) {if(it!=t.begin()) os<<","; os<<*it;} os<<"}"; return os;
}
template<class S, class T> ostream& operator<<(ostream &os, const pair<S,T> &t) { return os<<"("<<t.first<<","<<t.second<<")";}

const double INF = 1e9;
const int MOD = 1000000007;

#include <complex>
#include <cmath>
#define EPS 1.0e-10
#define PI 3.1415926535897932384 

// 実数の符号関数
inline int signum(double x) { return (abs(x) < EPS ? 0 : x > 0 ? 1 : -1); }
//XY座標
#define X real()
#define Y imag()
// 点
typedef complex<double> P;
 

// 線分・半直線・直線
struct L { P pos, dir; L(P p=P(), P d=P()):pos(p),dir(d){}};

// 多角形
typedef vector<P> G;
 
// 円
struct C { P p; double r; C(P q=P(), double R=0):p(q),r(R){}};

// std::norm はabs(p)*abs(p)なので遅い
inline double norm(P p){
	return p.X*p.X+p.Y*p.Y;
}

// 二つのベクトルの内積を計算する
inline double inp(const P& a, const P& b) {
	return (conj(a)*b).X;
}
 
// 二つのベクトルの外積を計算する
inline double outp(const P& a, const P& b) {
	return (conj(a)*b).Y;
}

inline int ccw(const P& p, const P& r, const P& s) {
    P a(r-p), b(s-p);
    int sgn = signum(outp(a, b));
    if (sgn != 0)
        return sgn;
    if (a.X*b.X < -EPS || a.Y*b.Y < -EPS)
        return -1;
    if (norm(a) < norm(b) - EPS)
        return 1;
    return 0;
}

bool ss_intersects(const L& s, const L& t) {
    return (ccw(s.pos, s.pos+s.dir, t.pos) *
            ccw(s.pos, s.pos+s.dir, t.pos+t.dir) <= 0 &&
            ccw(t.pos, t.pos+t.dir, s.pos) *
            ccw(t.pos, t.pos+t.dir, s.pos+s.dir) <= 0);
}

int Na, Nb;

double solve(const vector<P> &A, const vector<P> &B){
	double res = abs(A[0] - A[1]);
	L Ar(A[0], A[1] - A[0]);
	
	vector< vector<pair<int, double>> > g(B.size());
	REP(i, B.size())REP(j, i){
		L Br(B[i], B[j] - B[i]);
		if(!ss_intersects(Ar, Br)){
			g[i].emplace_back(j, abs(B[i] - B[j]));
			g[j].emplace_back(i, abs(B[i] - B[j]));
		}
	}
	vector<double> ret(B.size(), INF);
	priority_queue<pair<double, int>, vector<pair<double, int>>, greater<pair<double, int>> > dp;
	dp.push(pii(.0, 0));
	ret[0] = .0;
	while(!dp.empty()){
		int s = dp.top().second;
		double c = dp.top().first;
		dp.pop();
		if(s == 1){
			return res + c;
		}
		if(ret[s] < c) continue;
		FOR(it, g[s]){
			int t = it->first;
			if(ret[t]-EPS > ret[s]+it->second){
				ret[t] = ret[s]+it->second;
				dp.emplace(ret[t], t);
			}
		}
	}
	return INF;
}

main(){
	cin >> Na >> Nb;
	vector<P> A, B;
	REP(i, Na){
		double x, y;
		cin >> x >> y;
		A.emplace_back(x, y);
	}
	REP(i, Nb){
		double x, y;
		cin >> x >> y;
		B.emplace_back(x, y);
	}
	double res = min(solve(A, B), solve(B, A));
	if(res+1.0 > INF) puts("-1");
	else printf("%.12f\n", res);
	return 0;
}

Measured memory_bytes: 17736