#include using namespace std; typedef long long ll; #define fr(i,n) for(int i = 0;i eps; } int cmp(double a, double b){ return sgn(a-b);} //cmp(a,b) -1 se a pn; const int NN = 1e5+10; vector> g[NN]; int vis[NN]; double sq(double x){ return x*x; } pt forca_mod(pt p, double m){ double cm = p.mod(); return pt(p.x*m/cm,p.y*m/cm); } pt rot(pt p, double teta){ return pt(p.x*cos(teta)-p.y*sin(teta),p.y*cos(teta)+p.x*sin(teta)); } vector intersec_circ_circ(pt a, double ra, pt b, double rb){ vector ans; if(a==b) return vector(); if(ra>rb) swap(ra,rb), swap(a, b); double dist = (a-b).mod(); if(dist>rb-ra and distsq(rb)) va = forca_mod(b-a,ra); else va = forca_mod(a-b,ra); double teta = acos(dx/ra); ans.eb(a+rot(va,teta)); ans.eb(a+rot(va,2*PI-teta)); } else if(dist==ra+rb or dist==rb-ra){ ans.eb(b+forca_mod(a-b,rb)); } sort(all(ans)); return ans; } pt pmax(pt pa, pt pb){ if(pa=0; } pt proj(pt p, pt pa, pt pb){ double dist = dist_p_line(p,pa,pb); pt vp = forca_mod(pb-pa,dist); swap(vp.x,vp.y); if(a_esquerda(p,pa,pb)) vp.y*=-1; else vp.x*=-1; return p+vp; } pair intersec_circ_line(int ii, pt pa, pt pb){ pt p = centro[ii]; double rc = raio[ii]; double dist = dist_p_line(p,pa,pb); double x = sqrt(sq(rc)-sq(dist)); pair ans; ans.fi = proj(p, pa, pb) + forca_mod(pa-pb,x); ans.se = proj(p, pa, pb) - forca_mod(pa-pb,x); if(ans.se> v; fr(i,n){ if(dist_p_line(centro[i],pa,pb)> s; s.emplace(0,0); while(!s.empty()){ double curd; int no; tie(curd,no) = *s.begin(); s.erase(s.begin()); if(vis[no]) continue; vis[no] = 1; if(no==1) return curd; for(auto &par : g[no]){ int it; double c; tie(it,c) = par; if(!vis[it]){ s.emplace(curd+c,it); } } } puts("impossible"); exit(0); } int main(){ scanf("%lf%lf", &po.x, &po.y); scanf("%lf%lf", &pd.x, &pd.y); cin >> n; fr(i,n){ scanf("%lf%lf%lf", ¢ro[i].x, ¢ro[i].y, raio+i); } pn.eb(po); pn.eb(pd); fr(i,n){ fr(j,i){ vector cur = intersec_circ_circ(centro[i],raio[i],centro[j],raio[j]); for(auto &p : cur) pn.eb(p); } } fr(i,pn.size()) fr(j,i){ if(existe(i,j)){ double c = (pn[i]-pn[j]).mod(); g[i].eb(j,c); g[j].eb(i,c); } } printf("%.15lf\n", dij()); }