#include <bits/stdc++.h>
using namespace std;
template <typename T>
using vc = vector<T>;
using pii = pair<long double, long double>;
void xmax(long long& a, long long b) { a = max(a, b); }
void xmin(long long& a, long long b) { a = min(a, b); }
void print(vc<long long>& a, string second) {
  cerr << "prinitng " << second << ": ";
  for (long long i = 0; i < a.size(); i++) {
    cerr << a[i] << " ";
  }
  cerr << endl;
}
long long kreuz(long long a, long long b, long long c, long long d) {
  return a * d - b * c;
}
long long ccw(pii a, pii b, pii c) {
  return kreuz(a.first - b.first, a.second - b.second, a.first - c.first,
               a.second - c.second);
}
long double dist(pii a, pii b) {
  return sqrt((a.first - b.first) * (a.first - b.first) +
              (a.second - b.second) * (a.second - b.second));
}
pii cut(pii a, pii b, pii c, pii d) {
  b = {a.first - b.first, a.second - b.second};
  d = {c.first - d.first, c.second - d.second};
  if (kreuz(b.first, b.second, d.first, d.second) == 0) return {-1e4, 5};
  long double t = (c.second * d.first - c.first * d.second +
                   a.first * d.second - a.second * d.first) /
                  (b.second * d.first - b.first * d.second);
  long double second = (a.first * b.second - a.second * b.first -
                        c.first * b.second + c.second * b.first) /
                       (d.first * b.second - d.second * b.first);
  if (t < -1 || t > 0) return {-1e4, 7};
  if (second < -1 || second > 0) return {-1e5, 8};
  return {a.first + t * b.first, a.second + t * b.second};
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  pii p1, p2;
  cin >> p1.first >> p1.second >> p2.first >> p2.second;
  long long n;
  cin >> n;
  vc<pii> poly(n);
  for (long long i = 0; i < n; i++) {
    cin >> poly[i].first >> poly[i].second;
  }
  sort(poly.begin(), poly.end());
  pii pl = poly[0];
  pii pr = poly.back();
  vc<pii> oben;
  vc<pii> unten;
  for (long long i = 1; i + 1 < n; i++) {
    if (ccw(pl, poly[i], pr) > 0) {
      oben.push_back(poly[i]);
    } else {
      unten.push_back(poly[i]);
    }
  }
  vc<pii> p;
  p.push_back(pl);
  for (auto next : oben) p.push_back(next);
  p.push_back(pr);
  for (long long i = (long long)unten.size() - 1; i >= 0; i--)
    p.push_back(unten[i]);
  long long s1 = -1, s2 = -1;
  pii ss1, ss2;
  for (long long i = 0; i < n; i++) {
    pii schnitt = cut(p[i], p[(i + 1) % n], p1, p2);
    if (schnitt.first > -1e4) {
      if (schnitt == ss1) continue;
      if (s1 == -1) {
        s1 = i;
        ss1 = schnitt;
      } else {
        ss2 = schnitt;
        s2 = i;
      }
    }
  }
  if (s2 == -1) {
    cout << setprecision(14) << dist(p1, p2) << "\n";
  } else {
    long double mini = 1e8;
    if (dist(p1, ss1) > dist(p1, ss2)) swap(p1, p2);
    mini = min(mini, 2 * dist(ss1, ss2));
    long double d = dist(p[(s1 + 1) % n], ss1);
    for (long long k = s1 + 1; k != s2; k = (k + 1) % n) {
      d += dist(p[k], p[(k + 1) % n]);
    }
    d += dist(p[s2], ss2);
    mini = min(mini, d);
    long double d2 = dist(p[s1], ss1);
    for (long long k = s1; k != (s2 + 1) % n; k = (n + k - 1) % n) {
      d2 += dist(p[k], p[(n + k - 1) % n]);
    }
    d2 += dist(p[(s2 + 1) % n], ss2);
    mini = min(mini, d2);
    long double tot = 0;
    for (long long i = 0; i < n; i++) {
      tot += dist(p[i], p[(i + 1) % n]);
    }
    cout << setprecision(14) << mini + dist(p1, ss1) + dist(p2, ss2) << "\n";
  }
}
