#include <bits/stdc++.h>
using namespace std;
int n;
const double Exp = 1e-9;
int sgn(double x) {
  if (fabs(x) < Exp) return 0;
  return x > 0 ? 1 : -1;
}
struct Point {
  double x, y;
  Point(double x = 0, double y = 0) : 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, double b) {
    return Point(a.x * b, a.y * b);
  }
  friend Point operator/(const Point &a, double b) {
    return Point(a.x / b, a.y / b);
  }
  Point rotate(double del) {
    return Point(x * cos(del) - y * sin(del), x * sin(del) + y * cos(del));
  }
} s, t, island[40];
vector<Point> vec;
double Dot(const Point &a, const Point &b) { return a.x * b.x + a.y * b.y; }
double Cross(const Point &a, const Point &b) { return a.x * b.y - a.y * b.x; }
double Length(const Point &a) { return sqrt(Dot(a, a)); }
struct Line {
  Point p, v;
  Line(Point p, Point v) : p(p), v(v) {}
  Point get_point(double t) { return p + v * t; }
};
Point get_line_intersection(const Line &l1, const Line &l2) {
  Point a = l1.p, b = l1.p + l1.v;
  Point c = l2.p, d = l2.p + l2.v;
  double u = Cross(d - a, c - a), v = Cross(c - b, d - b);
  double t = u / (u + v);
  return a + (b - a) * t;
}
int if_point_on_line(const Point &p, const Point &st, const Point &ed) {
  return sgn(Cross(p - st, ed - st)) == 0;
}
int if_point_on_ray(const Point &p, const Point &st, const Point &ed) {
  if (sgn(Cross(p - st, ed - st)) != 0) return 0;
  if (sgn(Dot(p - st, ed - st)) < 0) return 0;
  return 1;
}
int if_point_on_segment(const Point &p, const Point &st, const Point &ed) {
  return if_point_on_ray(p, st, ed) && if_point_on_ray(p, ed, st);
}
int main() {
  cin >> s.x >> s.y >> t.x >> t.y;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> island[i].x >> island[i].y;
  }
  double sum = 0;
  int flag = 0;
  int cnt = 0;
  for (int i = 0; i < n; i++) {
    int l = i, r = i + 1;
    r %= n;
    sum += Length(island[r] - island[l]);
  }
  for (int i = 0; i < n; i++) {
    int l = i, r = i + 1;
    r %= n;
    if (flag == 1 && cnt < 2) vec.push_back(island[l]);
    Point now;
    if (sgn(Cross(s - t, island[r] - island[l])) != 0) {
      now = get_line_intersection(Line(s, t - s),
                                  Line(island[r], island[l] - island[r]));
      if (if_point_on_segment(now, island[l], island[r])) {
        if ((vec.size() > 0 && sgn(Length(vec[vec.size() - 1] - now)) != 0) ||
            vec.size() == 0) {
          if (if_point_on_segment(now, s, t)) {
            cnt++;
            flag = 1;
            vec.push_back(now);
            if (cnt == 2) break;
          }
        }
      }
    } else if (if_point_on_line(island[l], s, t)) {
      flag = 2;
      break;
    }
  }
  if (flag == 2 || cnt == 0) {
    double ans = Length(s - t);
    printf("%.9lf\n", ans);
    return 0;
  }
  double edge_len = 0;
  for (int i = 1; i < vec.size(); i++) {
    edge_len += Length(vec[i] - vec[i - 1]);
  }
  edge_len = min(edge_len, sum - edge_len);
  double s_len = min(Length(s - vec[0]), Length(s - vec[vec.size() - 1]));
  double t_len = min(Length(t - vec[0]), Length(t - vec[vec.size() - 1]));
  double ans1 = edge_len + s_len + t_len;
  double rest_len = Length(s - t);
  rest_len -= s_len + t_len;
  double ans2 = s_len + t_len + 2 * rest_len;
  double ans = min(ans1, ans2);
  printf("%.9lf\n", ans);
  return 0;
}
