#include <bits/stdc++.h>
using namespace std;
template <typename T, typename TT>
ostream& operator<<(ostream& s, pair<T, TT> t) {
  return s << "(" << t.first << "," << t.second << ")";
}
template <typename T>
ostream& operator<<(ostream& s, vector<T> t) {
  for (int i = 0; i < t.size(); i++) s << t[i] << " ";
  return s;
}
struct point {
  int first, second;
} s, e, a[120], u, v;
int n;
double d[120], L = 1, R, t, ti, Li, Ri;
int xm(point a, point b, point c) {
  return (b.first - a.first) * (c.second - a.second) -
         (b.second - a.second) * (c.first - a.first);
}
void add(double first, double second) {
  if (first > R) R = first, Ri = second;
  if (first < L) L = first, Li = second;
}
double D(point a, point b) {
  return sqrt((a.first - b.first) * (a.first - b.first) +
              (a.second - b.second) * (a.second - b.second) + 0.);
}
double C(double first) {
  int t = (int)first;
  return d[t] + (first - t) * (d[t + 1] - d[t]);
}
int main() {
  cin >> s.first >> s.second >> e.first >> e.second >> n;
  int i;
  for (i = 0; i < n; i++) cin >> a[i].first >> a[i].second;
  a[n] = a[0];
  for (i = 0; i < n; i++) {
    u = a[i], v = a[i + 1];
    if (xm(s, e, u) * xm(s, e, v) < 0 && xm(u, v, s) * xm(u, v, e) < 0) {
      t = (double)xm(v, u, s) / (xm(v, u, s) + xm(u, v, e));
      ti = i + (double)xm(s, e, u) / (xm(s, e, u) + xm(e, s, v));
      add(t, ti);
    }
  }
  for (i = 0; i < n; i++)
    if (fabs(D(s, a[i]) + D(a[i], e) - D(s, e)) < 1e-8)
      add(D(s, a[i]) / D(s, e), i);
  for (i = 0; i < n; i++) d[i + 1] = d[i] + D(a[i], a[i + 1]);
  if (L > R)
    printf("%.9lf\n", D(s, e));
  else {
    double dl = C(Li), dr = C(Ri);
    if (dl > dr) swap(dl, dr);
    printf("%.9lf\n",
           min(D(s, e) * (1 + R - L),
               D(s, e) * (1 - R + L) + min(dr - dl, d[n] - dr + dl)));
  }
  return 0;
}
