#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;   }