#include<iostream>
#include<math.h>
#include<algorithm>
#include <fstream>
using namespace std;
long double distanc(long double x, long double y, long double x1, long double y1)
{
long double difference_x=(x-x1)*1.0;
long double difference_y=(y-y1)*1.0;
// cout<<fixed;
// cout.precision(6);
long double ans= sqrt((difference_x*difference_x)+(difference_y*difference_y));
return ans;
}
long double maximum_happiness(long double *x, long double *y, long double *f, int *v, int n, long double happiness, int i, long double prevx, long double prevy)
{
if(i>n)
return 0.0;
long double distance = distanc(prevx, prevy, x[i], y[i]);
// cout<<distance<<"\n";
long double ans1{0},ans2{0};
ans1 += maximum_happiness(x,y,f,v,n,happiness-distance+f[i],i+1,x[i],y[i]) + (f[i] - distance);
ans2 += maximum_happiness(x,y,f,v,n,happiness,i+1,prevx,prevy);
cout<<fixed;
cout.precision(6);
//cout<<ans1<<" "<<ans2<<"\n";
if(ans1>ans2)
{
v[i] = 1;
return ans1;
}
else
{
return ans2;
}
}
int main()
{
int n;
cin>>n;
long double *x=new long double [n];
long double *y=new long double [n];
long double *f=new long double [n];
int *v=new int [n];
for(int i=0; i<n; i++)
{
cin>>x[i]>>y[i]>>f[i];
v[i] = 0;
}
cout<<fixed;
cout.precision(6);
long double happiness;
v[0] = 1;
long double ans = maximum_happiness(x, y, f, v, n-2, happiness,1,x[0],y[0]);
long double x1,y1;
int i;
for(i=(n-2) ; i>=0 ; i--)
{
if(v[i]==1)
break;
}
x1 = x[i];
y1 = y[i];
long double d = distanc(x1,y1,x[n-1],y[n-1]);
// cout<<d<<"\n";
happiness = ans - d + f[n-1] + f[0];
cout<<happiness;
delete[]x;
delete[]y;
delete[]f;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPG1hdGguaD4KI2luY2x1ZGU8YWxnb3JpdGhtPgojaW5jbHVkZSA8ZnN0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKbG9uZyBkb3VibGUgZGlzdGFuYyhsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5LCBsb25nIGRvdWJsZSB4MSwgbG9uZyBkb3VibGUgeTEpCnsKCWxvbmcgZG91YmxlIGRpZmZlcmVuY2VfeD0oeC14MSkqMS4wOwoJbG9uZyBkb3VibGUgZGlmZmVyZW5jZV95PSh5LXkxKSoxLjA7CgkvLyBjb3V0PDxmaXhlZDsKCS8vIGNvdXQucHJlY2lzaW9uKDYpOwoJbG9uZyBkb3VibGUgYW5zPSBzcXJ0KChkaWZmZXJlbmNlX3gqZGlmZmVyZW5jZV94KSsoZGlmZmVyZW5jZV95KmRpZmZlcmVuY2VfeSkpOwoJcmV0dXJuIGFuczsKfQoKbG9uZyBkb3VibGUgbWF4aW11bV9oYXBwaW5lc3MobG9uZyBkb3VibGUgKngsIGxvbmcgZG91YmxlICp5LCBsb25nIGRvdWJsZSAqZiwgaW50ICp2LCBpbnQgbiwgbG9uZyBkb3VibGUgaGFwcGluZXNzLCBpbnQgaSwgbG9uZyBkb3VibGUgcHJldngsIGxvbmcgZG91YmxlIHByZXZ5KQp7CglpZihpPm4pCiAgICAgICAgcmV0dXJuIDAuMDsKICAgIAogICAgbG9uZyBkb3VibGUgZGlzdGFuY2UgPSBkaXN0YW5jKHByZXZ4LCBwcmV2eSwgeFtpXSwgeVtpXSk7CiAgLy8gICBjb3V0PDxkaXN0YW5jZTw8IlxuIjsKICAgIGxvbmcgZG91YmxlIGFuczF7MH0sYW5zMnswfTsKICAgIAogICAgYW5zMSArPSBtYXhpbXVtX2hhcHBpbmVzcyh4LHksZix2LG4saGFwcGluZXNzLWRpc3RhbmNlK2ZbaV0saSsxLHhbaV0seVtpXSkgKyAoZltpXSAtIGRpc3RhbmNlKTsKICAgIAogICAgYW5zMiArPSBtYXhpbXVtX2hhcHBpbmVzcyh4LHksZix2LG4saGFwcGluZXNzLGkrMSxwcmV2eCxwcmV2eSk7CiAgICAKICAgIGNvdXQ8PGZpeGVkOwoJY291dC5wcmVjaXNpb24oNik7CiAgIC8vY291dDw8YW5zMTw8IiAiPDxhbnMyPDwiXG4iOwogICAgCiAgICBpZihhbnMxPmFuczIpCiAgICB7CiAgICAJdltpXSA9IDE7CiAgICAgICAgcmV0dXJuIGFuczE7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcmV0dXJuIGFuczI7CiAgICB9Cn0gCgoKaW50IG1haW4oKQp7CglpbnQgbjsKCWNpbj4+bjsKCWxvbmcgZG91YmxlICp4PW5ldyBsb25nIGRvdWJsZSBbbl07Cglsb25nIGRvdWJsZSAqeT1uZXcgbG9uZyBkb3VibGUgW25dOwoJbG9uZyBkb3VibGUgKmY9bmV3IGxvbmcgZG91YmxlIFtuXTsKICAgIGludCAqdj1uZXcgaW50IFtuXTsKICAgIAoJZm9yKGludCBpPTA7IGk8bjsgaSsrKQoJewoJCWNpbj4+eFtpXT4+eVtpXT4+ZltpXTsKICAgICAgICB2W2ldID0gMDsKCX0KICAgIGNvdXQ8PGZpeGVkOwoJY291dC5wcmVjaXNpb24oNik7CiAgICBsb25nIGRvdWJsZSBoYXBwaW5lc3M7CiAgICB2WzBdID0gMTsKCWxvbmcgZG91YmxlIGFucyA9IG1heGltdW1faGFwcGluZXNzKHgsIHksIGYsIHYsIG4tMiwgaGFwcGluZXNzLDEseFswXSx5WzBdKTsKICAgIAogICAgbG9uZyBkb3VibGUgeDEseTE7CiAgICBpbnQgaTsKICAgIAogICAgZm9yKGk9KG4tMikgOyBpPj0wIDsgaS0tKQogICAgewogICAgICAgIGlmKHZbaV09PTEpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgCiAgICB4MSA9IHhbaV07CiAgICB5MSA9IHlbaV07CiAgICAKICAgIGxvbmcgZG91YmxlIGQgPSBkaXN0YW5jKHgxLHkxLHhbbi0xXSx5W24tMV0pOwogICAgCiAgIC8vIGNvdXQ8PGQ8PCJcbiI7CiAgICBoYXBwaW5lc3MgPSBhbnMgLSBkICsgZltuLTFdICsgZlswXTsKICAgIGNvdXQ8PGhhcHBpbmVzczsKICAgIAogICAgCglkZWxldGVbXXg7CglkZWxldGVbXXk7CglkZWxldGVbXWY7Cn0K