#include <bits/stdc++.h>
using namespace std;
int dcmp(double p) {
  if (abs(p) < 1e-10) return 0;
  return p > 1e-10 ? 1 : -1;
}
struct Point {
  double x, y;
  Point() {}
  Point(double x, double y) : x(x), y(y) {}
  friend Point operator+(const Point &a, const Point &b) {
    return Point(a.x + b.x, a.y + b.y);
  }
  friend Point operator-(const Point &a, const Point &b) {
    return Point(a.x - b.x, a.y - b.y);
  }
  friend Point operator*(const Point &a, const double &p) {
    return Point(a.x * p, a.y * p);
  }
  friend Point operator/(const Point &a, const double &p) {
    return Point(a.x / p, a.y / p);
  }
  friend double operator*(const Point &a, const Point &b) {
    return a.x * b.y - a.y * b.x;
  }
  friend bool operator<(const Point &a, const Point &b) {
    return a.x < b.x || (dcmp(a.x - b.x) == 0 && a.y < b.y);
  }
  friend bool operator==(const Point &a, const Point &b) {
    return !dcmp(a.x - b.x) && !dcmp(a.y - b.y);
  }
  friend bool operator<=(const Point &a, const Point &b) {
    return a < b || a == b;
  }
  void Read() { scanf("%lf %lf", &x, &y); }
} S, T, p[110];
double Dot(const Point &a, const Point &b) { return a.x * b.x + a.y * b.y; }
double Len(const Point &a) { return sqrt(Dot(a, a)); }
int n;
void read() {
  S.Read(), T.Read();
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) p[i].Read();
}
bool in(Point a, Point b, Point c) {
  if (dcmp((a - b) * (c - b))) return false;
  if (c < b) swap(b, c);
  return b <= a && a <= c;
}
int inter(Point a, Point b, Point c, Point d) {
  double d1 = dcmp((c - a) * (b - a)), d2 = dcmp((d - a) * (b - a));
  double d3 = dcmp((d - c) * (b - c)), d4 = dcmp((d - c) * (a - c));
  if ((in(c, a, b) || in(d, a, b)) && dcmp((c - a) * (d - a))) return 2;
  if (d1 * d2 < 0 && d3 * d4 < 0) return 2;
  if (dcmp((c - a) * (d - a)) == 0 && d1 * d2 == 0 && d3 * d4 == 0) return 1;
  return 0;
}
Point getinter(const Point &p, const Point &v1, const Point &q,
               const Point &v2) {
  Point u = q - p;
  double t = (u * v2) / (v1 * v2);
  return p + v1 * t;
}
void work() {
  vector<Point> q;
  int cnt1 = 0;
  for (int i = 1; i <= n; ++i) {
    int type = inter(S, T, p[i], p[i % n + 1]);
    if (type == 1) ++cnt1;
    if (type == 2) q.push_back(getinter(S, T - S, p[i], p[i % n + 1] - p[i]));
  }
  sort(q.begin(), q.end());
  q.resize(unique(q.begin(), q.end()) - q.begin());
  if (cnt1 || cnt1 + q.size() <= 1)
    printf("%.10lf\n", Len(T - S));
  else {
    q.push_back(S), q.push_back(T);
    sort(q.begin(), q.end());
    double temp1 = Len(q[1] - q[0]) + 2 * Len(q[2] - q[1]) + Len(q[3] - q[2]);
    double temp2 = 0, len = 0, sum = 0;
    int t1, t2;
    for (int i = 1; i <= n; ++i) sum = sum + Len(p[i] - p[i % n + 1]);
    for (int i = 1; i <= n; ++i)
      if (in(q[1], p[i], p[i % n + 1])) {
        t1 = i;
        break;
      }
    for (int i = 1; i <= n; ++i)
      if (in(q[2], p[i], p[i % n + 1])) {
        t2 = i;
        break;
      }
    if (t1 == n && t2 == 1)
      len = len + Len(p[1] - q[1]) + Len(p[1] - q[2]);
    else
      len = len + Len(p[t1 % n + 1] - q[1]) + Len(p[t2] - q[2]);
    for (int i = t1 % n + 1; i != t2; i = i % n + 1)
      len = len + Len(p[i] - p[i % n + 1]);
    temp2 = min(len, sum - len) + Len(q[1] - q[0]) + Len(q[3] - q[2]);
    printf("%.10lf\n", min(temp1, temp2));
  }
}
int main() {
  read();
  work();
  return 0;
}
