#include <bits/stdc++.h>
using namespace std;
const long double INF = 1e18, eps = 1e-9;
const int N = 41;
int n, m;
long double D[N][N];
complex<long double> st, en, A[N];
inline long double Cross(complex<long double> a, complex<long double> b) {
  return (a.real() * b.imag() - a.imag() * b.real());
}
inline long double Get(complex<long double> a, complex<long double> b,
                       complex<long double> c, complex<long double> d) {
  long double ab_cd = Cross(b - a, d - c);
  if (abs(ab_cd) <= eps) return (-INF);
  return Cross(c - a, d - c) / ab_cd;
}
inline complex<long double> Intersection(complex<long double> a,
                                         complex<long double> b,
                                         complex<long double> c,
                                         complex<long double> d) {
  long double r = Get(a, b, c, d), t = Get(c, d, a, b);
  if (min(r, t) < 0.0 || max(r, t) > 1.0)
    return complex<long double>(-INF, -INF);
  return (a + (b - a) * r);
}
inline long double Dist(complex<long double> a, complex<long double> b) {
  return sqrt((a.real() - b.real()) * (a.real() - b.real()) +
              (a.imag() - b.imag()) * (a.imag() - b.imag()));
}
inline void Add(int i, int j, long double d) { D[i][j] = D[j][i] = d; }
inline complex<long double> read() {
  long double a, b;
  cin >> a >> b;
  return complex<long double>(a, b);
}
int main() {
  st = read();
  en = read();
  cin >> n;
  m = n;
  for (int i = 0; i < n; i++) A[i] = read();
  for (int i = 0; i < N; i++)
    for (int j = 0; j < N; j++)
      if (i != j) D[i][j] = INF;
  for (int i = 0; i < n; i++) {
    complex<long double> p = Intersection(st, en, A[i], A[(i + 1) % n]);
    if (p.real() != -INF) {
      if (m >= n + 1 && A[n] == p) continue;
      if (m >= n + 2 && A[n + 1] == p) continue;
      Add(m, i, Dist(p, A[i]));
      Add(m, (i + 1) % n, Dist(p, A[(i + 1) % n]));
      A[m++] = p;
    }
  }
  if (m <= n + 1) return cout << fixed << setprecision(10) << Dist(st, en), 0;
  if (Dist(st, A[n]) > Dist(st, A[n + 1])) swap(A[n], A[n + 1]);
  Add(n + 2, n, Dist(st, A[n]));
  Add(n + 3, n + 1, Dist(en, A[n + 1]));
  Add(n, n + 1, Dist(A[n], A[n + 1]) * 2);
  for (int i = 0; i < n; i++) Add(i, (i + 1) % n, Dist(A[i], A[(i + 1) % n]));
  for (int k = 0; k <= n + 3; k++)
    for (int i = 0; i <= n + 3; i++)
      for (int j = 0; j <= n + 3; j++)
        D[i][j] = min(D[i][j], D[i][k] + D[k][j]);
  cout << fixed << setprecision(10) << D[n + 2][n + 3];
  return (0);
}
