#include <bits/stdc++.h>
using namespace std;
int m, n, j, k, l, i, o, p, __t, temp(-1), tempx, __i;
double sigma_dis;
struct point {
  double x, y;
  void read() { scanf("%lf%lf", &x, &y); }
} A, B, P[10000], C, D;
double cross(point a, point b, point c) {
  return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
}
double dist(point a, point b) {
  return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
bool inside(point a, point b, point c) {
  if (abs(cross(a, b, c)) > 1e-8) return 0;
  if (c.x < min(a.x, b.x) - 1e-8 || c.x > max(a.x, b.x) ||
      c.y < min(a.y, b.y) || c.y > max(a.y, b.y))
    return 0;
  return 1;
}
bool operator==(point a, point b) {
  return abs(a.x - b.x) < 1e-8 && abs(a.y - b.y) < 1e-8;
}
double f(double a11, double a12, double a21, double a22) {
  return a11 * a22 - a12 * a21;
}
double get_line(double &a, double &b, double &c, point a1, point a2) {
  if (abs(a1.y - a2.y) < 1e-8)
    a = 0, b = 1;
  else if (abs(a1.x - a2.x) < 1e-8)
    b = 0, a = 1;
  else
    a = 1, b = -(a * (a1.x - a2.x)) / (a1.y - a2.y);
  c = -a * a1.x - b * a1.y;
}
point getcross(point A1, point A2, point B1, point B2) {
  double a1, b1, c1, a2, b2, c2;
  get_line(a1, b1, c1, A1, A2);
  get_line(a2, b2, c2, B1, B2);
  point ret;
  ret.x = -f(c1, b1, c2, b2) / f(a1, b1, a2, b2);
  ret.y = -f(a1, c1, a2, c2) / f(a1, b1, a2, b2);
  return ret;
}
void updata(point E) {
  if (C.x == -100000000 || (C.x != -100000000 && dist(A, C) > dist(A, E))) {
    if (C.x == -100000000)
      temp = 1;
    else
      temp = 2;
    D = C, C = E;
  } else if (D.x == -100000000 ||
             (D.x != -100000000 && dist(A, D) > dist(A, E)))
    D = E, temp = 2, tempx = __i;
}
double get_dis(point C) {
  double ret = 0;
  for (int i = 1; i <= m; i++) {
    if (inside(P[i], P[i + 1], C)) return ret += dist(P[i], C);
    ret += dist(P[i], P[i + 1]);
  }
}
int main() {
  A.read(), B.read();
  scanf("%d", &m);
  for (int i = 1; i <= m; i++) P[i].read();
  P[m + 1] = P[1];
  C.x = -100000000;
  D.x = -100000000;
  for (int i = 1; i <= m; i++) {
    if (inside(A, B, P[i])) __i = i, updata(P[i]);
    sigma_dis += dist(P[i], P[i + 1]);
  }
  if ((tempx != 0 && temp == 2 && (P[tempx + 1] == C || P[tempx - 1] == C))) {
    printf("%.9lf\n", dist(A, B));
    return 0;
  }
  for (int i = 1; i <= m; i++) {
    if (cross(A, B, P[i]) * cross(A, B, P[i + 1]) < -1e-8 &&
        cross(P[i], P[i + 1], A) * cross(P[i], P[i + 1], B) < -1e-8) {
      point u = getcross(A, B, P[i], P[i + 1]);
      updata(u);
    }
  }
  if (temp == -1 || temp == 1) {
    printf("%.9lf\n", dist(A, B));
    return 0;
  }
  double dis = get_dis(C) - get_dis(D);
  if (dis < 1e-8) dis += sigma_dis;
  if (sigma_dis - dis < dis) dis = sigma_dis - dis;
  printf("%.9lf\n", dist(A, C) + dist(B, D) + min(dis, 2.0 * dist(C, D)));
}
