#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using P = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vector<int>>;
using vll = vector<ll>;
using vvll = vector<vector<ll>>;
const ll MOD = 1000000007;
const int INF = 1000000000;
const ll LINF = 1ll<<50;
template<typename T>
void printv(const vector<T>& s) {
  for(int i=0;i<(int)(s.size());++i) {
    cout << s[i];
    if(i == (int)(s.size())-1) cout << endl;
    else cout << " ";
  }
}
template<typename T1, typename T2>
ostream& operator<<(ostream &os, const pair<T1, T2> p) {
  os << p.first << ":" << p.second;
  return os;
}
using Point = std::complex<ld>;
const ld eps = 1e-9, pi = acos(-1.0);
namespace std {
bool operator<(const Point &lhs, const Point &rhs) {
  if (lhs.real() < rhs.real() - eps) return true;
  if (lhs.real() > rhs.real() + eps) return false;
  return lhs.imag() < rhs.imag();
}
}
Point input_point() {
  ld x, y;
  std::cin >> x >> y;
  return Point(x, y);
}
bool eq(ld a, ld b) { return (abs(a - b) < eps); }
ld dot(Point a, Point b) { return real(conj(a) * b); }
ld cross(Point a, Point b) { return imag(conj(a) * b); }
int ccw(Point a, Point b, Point c) {
  b -= a;
  c -= a;
  if (cross(b, c) > eps) return 1;
  if (cross(b, c) < -eps) return -1;
  if (dot(b, c) < 0) return 2;
  if (norm(b) < norm(c)) return -2;
  return 0;
}
class Line {
 public:
  Point a, b;
  Line() : a(Point(0, 0)), b(Point(0, 0)) {}
  Line(Point a, Point b) : a(a), b(b) {}
};
ld dot(Line l, Line m) { return dot((l.a - l.b), (m.a - m.b)); }
class Circle {
 public:
  Point p;
  ld r;
  Circle() : p(Point(0, 0)), r(0) {}
  Circle(Point p, ld r) : p(p), r(r) {}
};
bool isis_ll(Line l, Line m) { return !eq(cross(l.b - l.a, m.b - m.a), 0); }
bool isis_ss(Line s, Line t) {
  return ccw(s.a, s.b, t.a) * ccw(s.a, s.b, t.b) <= 0 &&
         ccw(t.a, t.b, s.a) * ccw(t.a, t.b, s.b) <= 0;
}
double dist(double x1, double y1, double x2, double y2) {
  return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
struct Elm {
  ld d;
  int idx;
};
bool operator< (const Elm &e1, const Elm &e2) {
  return e1.d > e2.d;
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(12);
  int na, nb; cin >> na >> nb;
  vector<Point> pa(na), pb(nb);
  for(int i=0;i<na;++i) {
    pa[i] = input_point();
  }
  for(int i=0;i<nb;++i) {
    pb[i] = input_point();
  }
  priority_queue<Elm> pqa, pqb;
  vector<ld> da(na, INF), db(nb, INF);
  pqa.push({0, 0});
  pqb.push({0, 0});
  da[0] = 0;
  db[0] = 0;
  while(!pqa.empty()) {
    auto now = pqa.top(); pqa.pop();
    ld d = now.d;
    int idx = now.idx;
    if(da[idx] < d) continue;
    for(int i=0;i<na;++i) {
      if(idx == i) continue;
      if(isis_ss(Line(pa[idx], pa[i]), Line(pb[0], pb[1]))) continue;
      if(da[i] > d + abs(pa[idx] - pa[i])) {
        da[i] = d + abs(pa[idx] - pa[i]);
        pqa.push({da[i], i});
      }
    }
  }
  while(!pqb.empty()) {
    auto now = pqb.top(); pqb.pop();
    ld d = now.d;
    int idx = now.idx;
    if(db[idx] < d) continue;
    for(int i=0;i<nb;++i) {
      if(idx == i) continue;
      if(isis_ss(Line(pb[idx], pb[i]), Line(pa[0], pa[1]))) continue;
      if(db[i] > d + abs(pb[idx] - pb[i])) {
        db[i] = d + abs(pb[idx] - pb[i]);
        pqb.push({db[i], i});
      }
    }
  }
  if(da[1] == INF && db[1] == INF) cout << -1 << endl;
  else cout << min(da[1] + abs(pb[0] - pb[1]), db[1] + abs(pa[0] - pa[1])) << endl;
}



Measured memory_bytes: 3492