#include <bits/stdc++.h>
std::complex<double> omega(std::complex<double> x, std::complex<double> y) {
  return conj(x - y) / (x - y);
}
std::complex<double> rho(std::complex<double> x, std::complex<double> y) {
  return (conj(x) * y - x * conj(y)) / (x - y);
}
std::complex<double> intersection(std::complex<double> a,
                                  std::complex<double> b,
                                  std::complex<double> c,
                                  std::complex<double> d) {
  return (rho(a, b) - rho(c, d)) / (omega(a, b) - omega(c, d));
}
int turn2(std::complex<double> a, std::complex<double> b,
          std::complex<double> c) {
  double x = imag((a - b) * conj(c - b));
  return x < 0 ? -1 : x > 0;
}
bool straddles(std::complex<double> a, std::complex<double> b,
               std::complex<double> c, std::complex<double> d) {
  return turn2(c, d, a) * turn2(c, d, b) == -1 &&
         turn2(a, b, c) * turn2(a, b, d) == -1;
}
std::complex<double> start, end;
std::vector<std::complex<double> > x;
std::vector<std::complex<double> > inter;
std::vector<int> inter_index;
int n;
std::complex<double> readcom() {
  int a, b;
  scanf("%d%d", &a, &b);
  return std::complex<double>(a, b);
}
std::complex<double> getx(int i) { return x[(i + n) % n]; }
int main() {
  start = readcom();
  end = readcom();
  scanf("%d", &n);
  for (int i = 0; i < n; i++) x.push_back(readcom());
  for (int i = 0; i < n; i++) {
    int j = (i + 1) % n;
    if (straddles(x[i], x[j], start, end)) {
      inter.push_back(intersection(x[i], x[j], start, end));
      inter_index.push_back(i);
    }
    if (turn2(start, end, x[i]) == 0) {
      inter.push_back(x[i]);
      inter_index.push_back(i);
    }
  }
  assert(inter.size() <= 2);
  if (inter.size() < 2) {
    printf("%.9f\n", abs(start - end));
  } else {
    double to = std::min(abs(start - inter[0]) + abs(inter[1] - end),
                         abs(start - inter[1]) + abs(inter[0] - end));
    double a = abs(inter[0] - getx(inter_index[0] + 1)) +
               abs(inter[1] - getx(inter_index[1]));
    for (int i = (inter_index[0] + 1) % n; i != inter_index[1]; i = (i + 1) % n)
      a += abs(getx(i) - getx(i + 1));
    double b = abs(inter[1] - getx(inter_index[1] + 1)) +
               abs(inter[0] - getx(inter_index[0]));
    for (int i = (inter_index[1] + 1) % n; i != inter_index[0]; i = (i + 1) % n)
      b += abs(getx(i) - getx(i + 1));
    double c = abs(inter[0] - inter[1]) * 2;
    printf("%.9f\n", to + std::min(a, std::min(b, c)));
  }
  return 0;
}
