//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>
using namespace std;
#define int ll
#define endl '\n'
#define unoset unordered_set
#define unomap unordered_map
#define strstr stringstream
#define SZ(a) (int)a.size()
#define Unique(a) a.resize(unique(all(a)) - a.begin())
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define all(s) s.begin(), s.end()
#define rall(s) s.rbegin(), s.rend()
#define rev reverse
#define gcd __gcd
#define pushb push_back
#define popb pop_back
#define pushf push_front
#define popf pop_front
#define emp emplace
#define empb emplace_back
#define empf emplace_front
#define lcm(a, b) (a / __gcd(a, b) * b)
#define log_base(x, base) log(x) / log(base)
#define debug cerr<<"No errors!",exit(0);
#define forw(i, a, b) for (int i = a; i <= b; ++i)
#define forw2(i, a, b) for (ll i = a; i <= b; ++i)
#define fors(i, a, b) for (int i = a; i >= b; --i)
#define fors2(i, a, b) for (ll i = a; i >= b; --i)
#define pqueue priority_queue
#define sqrt sqrtl
#define i128 __int128
#define popcount __builtin_popcountll
#define BIT(x, i) (((x) >> (i)) & 1)
#define MASK(x) ((1LL) << (x))
#define want_digit(x) cout << fixed << setprecision(x);
#define excuting_time 1000.0 * clock() / CLOCKS_PER_SEC
#define mapa make_pair
#define ms(a, x) memset(a, x, sizeof(a))
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef double db;
typedef string str;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int MOD = 1e9 + 7; // 998244353
const int inf = 1e9;
const ll INF = 1e18; // MASK(63) - 1
const int limN = 1e5 + 5;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
inline ll random(const ll &L, const ll &R) {
return uniform_int_distribution<ll> (L, R) (rng);
}
/* -------~~~~~~===== END OF TEMPLATE =====~~~~~~------- */
ldb dist(int x, int y, int u, int v) {
return sqrt((x - u) * (x - u) + (y - v) * (y - v));
}
int ccw(pii p, pii q, pii r) {
ll val = (q.fi - p.fi) * (r.se - p.se) - (q.se - p.se) * (r.fi - p.fi);
if (val < 0) return -1;
if (val > 0) return 1;
return 0;
}
bool on(pii p, pii q, pii r) {
return r.fi >= min(p.fi, q.fi) && r.fi <= max(p.fi, q.fi) &&
r.se >= min(p.se, q.se) && r.se <= max(p.se, q.se);
}
bool cut(pii a, pii b, pii m, pii n) {
int o1 = ccw(a, b, m), o2 = ccw(a, b, n);
int o3 = ccw(m, n, a), o4 = ccw(m, n, b);
if (o1 != o2 && o3 != o4) return true;
if (!o1 && on(a, b, m)) return true;
if (!o2 && on(a, b, n)) return true;
if (!o3 && on(m, n, a)) return true;
if (!o4 && on(m, n, b)) return true;
return false;
}
pii a, b, m, n;
void solve() {
cin >> a.fi >> a.se >> b.fi >> b.se >> m.fi >> m.se >> n.fi >> n.se;
want_digit(10);
if (cut(a, b, m, n)) {
cout << min(dist(m.fi, m.se, a.fi, a.se) + dist(a.fi, a.se, n.fi, n.se),
dist(m.fi, m.se, b.fi, b.se) + dist(b.fi, b.se, n.fi, n.se)) << endl;
}
else cout << dist(m.fi, m.se, n.fi, n.se) << endl;
}
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
#define name "test"
if (fopen(name".INP", "r")) {
freopen(name".INP", "r", stdin);
freopen(name".OUT", "w", stdout);
}
bool testCase = false;
int numTest = 1;
// cin >> numTest;
forw (i, 1, numTest) {
if (testCase) cout << "Case #" << i << ": ";
solve();
}
return 0;
}
Ly8jcHJhZ21hIEdDQyBvcHRpbWl6ZSgiTzMsdW5yb2xsLWxvb3BzIikKLy8jcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsYm1pLGJtaTIsbHpjbnQscG9wY250IikKCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBpbnQgbGwKI2RlZmluZSBlbmRsICdcbicKI2RlZmluZSB1bm9zZXQgdW5vcmRlcmVkX3NldAojZGVmaW5lIHVub21hcCB1bm9yZGVyZWRfbWFwCiNkZWZpbmUgc3Ryc3RyIHN0cmluZ3N0cmVhbQojZGVmaW5lIFNaKGEpIChpbnQpYS5zaXplKCkKI2RlZmluZSBVbmlxdWUoYSkgYS5yZXNpemUodW5pcXVlKGFsbChhKSkgLSBhLmJlZ2luKCkpCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBsYiBsb3dlcl9ib3VuZAojZGVmaW5lIHViIHVwcGVyX2JvdW5kCiNkZWZpbmUgYWxsKHMpIHMuYmVnaW4oKSwgcy5lbmQoKQojZGVmaW5lIHJhbGwocykgcy5yYmVnaW4oKSwgcy5yZW5kKCkKI2RlZmluZSByZXYgcmV2ZXJzZQojZGVmaW5lIGdjZCBfX2djZAojZGVmaW5lIHB1c2hiIHB1c2hfYmFjawojZGVmaW5lIHBvcGIgcG9wX2JhY2sKI2RlZmluZSBwdXNoZiBwdXNoX2Zyb250CiNkZWZpbmUgcG9wZiBwb3BfZnJvbnQKI2RlZmluZSBlbXAgZW1wbGFjZQojZGVmaW5lIGVtcGIgZW1wbGFjZV9iYWNrCiNkZWZpbmUgZW1wZiBlbXBsYWNlX2Zyb250CiNkZWZpbmUgbGNtKGEsIGIpIChhIC8gX19nY2QoYSwgYikgKiBiKQojZGVmaW5lIGxvZ19iYXNlKHgsIGJhc2UpIGxvZyh4KSAvIGxvZyhiYXNlKQojZGVmaW5lIGRlYnVnIGNlcnI8PCJObyBlcnJvcnMhIixleGl0KDApOwojZGVmaW5lIGZvcncoaSwgYSwgYikgIGZvciAoaW50IGkgPSBhOyBpIDw9IGI7ICsraSkKI2RlZmluZSBmb3J3MihpLCBhLCBiKSBmb3IgKGxsIGkgPSBhOyBpIDw9IGI7ICsraSkKI2RlZmluZSBmb3JzKGksIGEsIGIpICBmb3IgKGludCBpID0gYTsgaSA+PSBiOyAtLWkpCiNkZWZpbmUgZm9yczIoaSwgYSwgYikgZm9yIChsbCBpID0gYTsgaSA+PSBiOyAtLWkpCiNkZWZpbmUgcHF1ZXVlIHByaW9yaXR5X3F1ZXVlCiNkZWZpbmUgc3FydCBzcXJ0bAojZGVmaW5lIGkxMjggX19pbnQxMjgKI2RlZmluZSBwb3Bjb3VudCBfX2J1aWx0aW5fcG9wY291bnRsbAojZGVmaW5lIEJJVCh4LCBpKSAoKCh4KSA+PiAoaSkpICYgMSkKI2RlZmluZSBNQVNLKHgpICgoMUxMKSA8PCAoeCkpCiNkZWZpbmUgd2FudF9kaWdpdCh4KSBjb3V0IDw8IGZpeGVkIDw8IHNldHByZWNpc2lvbih4KTsKI2RlZmluZSBleGN1dGluZ190aW1lIDEwMDAuMCAqIGNsb2NrKCkgLyBDTE9DS1NfUEVSX1NFQwojZGVmaW5lIG1hcGEgbWFrZV9wYWlyCiNkZWZpbmUgbXMoYSwgeCkgbWVtc2V0KGEsIHgsIHNpemVvZihhKSkKCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGw7CnR5cGVkZWYgbG9uZyBkb3VibGUgbGRiOwp0eXBlZGVmIGRvdWJsZSBkYjsKdHlwZWRlZiBzdHJpbmcgc3RyOwp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IHBpaTsKdHlwZWRlZiBwYWlyPGxsLCBsbD4gcGxsOwoKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7IC8vIDk5ODI0NDM1Mwpjb25zdCBpbnQgaW5mID0gMWU5Owpjb25zdCBsbCBJTkYgPSAxZTE4OyAvLyBNQVNLKDYzKSAtIDEKY29uc3QgaW50IGxpbU4gPSAxZTUgKyA1OwoKbXQxOTkzN182NCBybmcoY2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKTsKaW5saW5lIGxsIHJhbmRvbShjb25zdCBsbCAmTCwgY29uc3QgbGwgJlIpIHsKICAgIHJldHVybiB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248bGw+IChMLCBSKSAocm5nKTsKfQoKLyogLS0tLS0tLX5+fn5+fj09PT09IEVORCBPRiBURU1QTEFURSA9PT09PX5+fn5+fi0tLS0tLS0gKi8KCgpsZGIgZGlzdChpbnQgeCwgaW50IHksIGludCB1LCBpbnQgdikgewogICAgcmV0dXJuIHNxcnQoKHggLSB1KSAqICh4IC0gdSkgKyAoeSAtIHYpICogKHkgLSB2KSk7Cn0KCmludCBjY3cocGlpIHAsIHBpaSBxLCBwaWkgcikgewogICAgbGwgdmFsID0gKHEuZmkgLSBwLmZpKSAqIChyLnNlIC0gcC5zZSkgLSAocS5zZSAtIHAuc2UpICogKHIuZmkgLSBwLmZpKTsKICAgIGlmICh2YWwgPCAwKSByZXR1cm4gLTE7CiAgICBpZiAodmFsID4gMCkgcmV0dXJuIDE7CiAgICByZXR1cm4gMDsKfQoKYm9vbCBvbihwaWkgcCwgcGlpIHEsIHBpaSByKSB7CiAgICByZXR1cm4gci5maSA+PSBtaW4ocC5maSwgcS5maSkgJiYgci5maSA8PSBtYXgocC5maSwgcS5maSkgJiYKICAgICAgICAgICByLnNlID49IG1pbihwLnNlLCBxLnNlKSAmJiByLnNlIDw9IG1heChwLnNlLCBxLnNlKTsKfQoKYm9vbCBjdXQocGlpIGEsIHBpaSBiLCBwaWkgbSwgcGlpIG4pIHsKICAgIGludCBvMSA9IGNjdyhhLCBiLCBtKSwgbzIgPSBjY3coYSwgYiwgbik7CiAgICBpbnQgbzMgPSBjY3cobSwgbiwgYSksIG80ID0gY2N3KG0sIG4sIGIpOwoKICAgIGlmIChvMSAhPSBvMiAmJiBvMyAhPSBvNCkgcmV0dXJuIHRydWU7CiAgICBpZiAoIW8xICYmIG9uKGEsIGIsIG0pKSByZXR1cm4gdHJ1ZTsKICAgIGlmICghbzIgJiYgb24oYSwgYiwgbikpIHJldHVybiB0cnVlOwogICAgaWYgKCFvMyAmJiBvbihtLCBuLCBhKSkgcmV0dXJuIHRydWU7CiAgICBpZiAoIW80ICYmIG9uKG0sIG4sIGIpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKfQoKcGlpIGEsIGIsIG0sIG47CnZvaWQgc29sdmUoKSB7CiAgICBjaW4gPj4gYS5maSA+PiBhLnNlID4+IGIuZmkgPj4gYi5zZSA+PiBtLmZpID4+IG0uc2UgPj4gbi5maSA+PiBuLnNlOwogICAgd2FudF9kaWdpdCgxMCk7CgogICAgaWYgKGN1dChhLCBiLCBtLCBuKSkgewogICAgICAgIGNvdXQgPDwgbWluKGRpc3QobS5maSwgbS5zZSwgYS5maSwgYS5zZSkgKyBkaXN0KGEuZmksIGEuc2UsIG4uZmksIG4uc2UpLAogICAgICAgICAgICAgICAgICAgIGRpc3QobS5maSwgbS5zZSwgYi5maSwgYi5zZSkgKyBkaXN0KGIuZmksIGIuc2UsIG4uZmksIG4uc2UpKSA8PCBlbmRsOwogICAgfQogICAgZWxzZSBjb3V0IDw8IGRpc3QobS5maSwgbS5zZSwgbi5maSwgbi5zZSkgPDwgZW5kbDsKfQoKc2lnbmVkIG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSksIGNpbi50aWUobnVsbHB0cik7CiAgICAjZGVmaW5lIG5hbWUgInRlc3QiCiAgICBpZiAoZm9wZW4obmFtZSIuSU5QIiwgInIiKSkgewogICAgICAgIGZyZW9wZW4obmFtZSIuSU5QIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbihuYW1lIi5PVVQiLCAidyIsIHN0ZG91dCk7CiAgICB9CiAgICBib29sIHRlc3RDYXNlID0gZmFsc2U7CiAgICBpbnQgbnVtVGVzdCA9IDE7CiAgICAvLyBjaW4gPj4gbnVtVGVzdDsKICAgIGZvcncgKGksIDEsIG51bVRlc3QpIHsKICAgICAgICBpZiAodGVzdENhc2UpIGNvdXQgPDwgIkNhc2UgIyIgPDwgaSA8PCAiOiAiOwogICAgICAgIHNvbHZlKCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQo=