#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) FOR(i,0,n)
#define ALL(c) (c).begin(),(c).end()
#define ZERO(a) memset(a,0,sizeof(a))
#define MINUS(a) memset(a,0xff,sizeof(a))
#define MINF(a) memset(a,0x3f,sizeof(a))
#define POW(n) (1LL<<(n))
#define IN(i,a,b) (a <= i && i <= b)
using namespace std;
template <typename T> inline bool CHMIN(T& a,T b) { if(a>b) { a=b; return 1; } return 0; }
template <typename T> inline bool CHMAX(T& a,T b) { if(a<b) { a=b; return 1; } return 0; }
template <typename T> inline void SORT(T& a) { sort(ALL(a)); }
template <typename T> inline void REV(T& a) { reverse(ALL(a)); }
template <typename T> inline void UNI(T& a) { sort(ALL(a)); a.erase(unique(ALL(a)),a.end()); }
const int MOD = 1000000007;
// const int INF = 0x3f3f3f3f3f3f3f3f;
// const double EPS = 1e-10;
/* ---------------------------------------------------------------------------------------------------- */

/* 基本要素 */

using D = double; // 座標値の型 doubleかlong double
using P = complex<D>; // Point
using L = pair<P,P>;  // Line
using VP = vector<P>;
const D EPS = 1e-8;  // 許容誤差
const D INF = 1e12;
#define X real()
#define Y imag()
#define LT(n,m) ((n)+EPS<(m)) // n < m ?
#define LE(n,m) ((n)-EPS<(m)) // n <= m ?
#define GT(n,m) LT(m,n) // n > m ?
#define GE(n,m) LE(m,n) // n >= m ?
#define EQ(n,m) (abs((n)-(m))<EPS)
#define NE(n,m) !EQ(n,m)
#define rep(i,n) for (int i=0;i<(n);++i)

namespace std {
  istream& operator >> (istream& is, P& p) {
    int F, S;
    is >> F >> S;
    p = P(F,S);
    return is;
  }
  bool operator < (const P a, const P b) {
    return NE(a.X,b.X) ? LT(a.X,b.X) : LT(a.Y,b.Y);
  }
  bool operator > (const P a, const P b) {
    return NE(a.X,b.X) ? GT(a.X,b.X) : GT(a.Y,b.Y);
  }
  bool sort_y(const P a, const P b) {
    return LT(a.Y,b.Y);
  }
  void swap(P& a, P& b) {
    P c = a; a = b; b = c;
  }
}

// 内積
D dot(P a, P b) {
  return (conj(a)*b).X;
}
// 外積
D cross(P a, P b) {
  return (conj(a)*b).Y;
}
// 点aから見た、点bから点cへの方向
int ccw(P a, P b, P c) {
  b -= a; c -= a;
  if (GT(cross(b,c),0)) return +1;  // counter clockwise
  if (LT(cross(b,c),0)) return -1;  // clockwise
  if (LT(dot(b,c),0)) return +2;  // c--a--b on line
  if (LT(norm(b),norm(c))) return -2; // a--b--c on line or a==b
  return 0;                     // a--c--b on line or a==c or b==c
}
// 線分と線分
bool isecSS(P a1, P a2, P b1, P b2) {
  return ccw(a1,a2,b1) * ccw(a1,a2,b2) <= 0 && ccw(b1,b2,a1)*ccw(b1,b2,a2) <= 0;
}

D calc(VP ps, P s, P g, P a, P b) {
  D res = abs(a-b);
  vector<D> dis(ps.size(),INF);
  dis[0] = 0;
  using PP = pair<D,int>;
  priority_queue<PP,vector<PP>,greater<PP>> que;
  que.emplace(0,0);
  while (!que.empty()) {
    D dd;
    int v;
    tie(dd,v) = que.top(); que.pop();
    if (dis[v] < dd) continue;
    for (int i = 0; i < ps.size(); i++) {
      if (i == v) continue;
      if (isecSS(ps[v],ps[i],a,b)) continue;
      if (GT(dis[i],dis[v]+abs(ps[v]-ps[i]))) {
        dis[i] = dis[v]+abs(ps[v]-ps[i]);
        que.emplace(dis[i],i);
      }
    }
  }
  res += dis[1];
  return res;
}

signed main() {
  cin.tie(0);
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(10);

  int N,M;
  cin >> N >> M;
  VP A(N), B(M);
  REP(i,N) cin >> A[i];
  REP(i,M) cin >> B[i];
  D ans = min(calc(B,B[0],B[1],A[0],A[1]),calc(A,A[0],A[1],B[0],B[1]));
  if (GE(ans,INF)) cout << -1 << endl;
  else cout << ans << endl;

  return 0;
}


Measured memory_bytes: 3500