//题意:给出平面上n个bottle 两个人和bin的坐标 求把bot捡完所需要最短时间 n<=1e5
//除了第一次是从pos->bot->bin 其余之后的路线都为bin->bot->bin
//贪心假设:两人初始都在bin时 ans=2*sigma(distance(bin,bot(i))) 乘2为来回
//现在由于每个人第一次选择bot不同 导致时间的变化T
//若两人分别选择bot(i,j) ans=ans+T T=(-dis(bot(i),bin)-dis(bot(j),bin)+dis(bot(i),A)+dis(bot(j),B)
//先求出数组d=dis(A,bot(i))-dis(bot(i),bin))
//对d排序,枚举第一个人选bot后就能快速在d2中找到最小的bot(j) 注意特判 有一个人不拿bot即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+20;
const ll inf=1e18;
pair<double,double> p[N];
int n;
struct node{
double d;
int u;//bot u
}d1[N],d2[N];
bool cmp(node a,node b)
{
return a.d<b.d;
}
double dis(double x1,double y1,double x2,double y2)
{
return sqrt((ll)(y2-y1)*(y2-y1)+(ll)(x2-x1)*(x2-x1));
}
int main()
{
double ax,ay,bx,by,tx,ty;
cin>>ax>>ay>>bx>>by>>tx>>ty;
cin>>n;
double ans=0;
for(int i=0;i<n;i++)
{
cin>>p[i].first>>p[i].second;
double x=p[i].first,y=p[i].second;
d1[i].d=dis(ax,ay,x,y)-dis(tx,ty,x,y);
d2[i].d=dis(bx,by,x,y)-dis(tx,ty,x,y);
d1[i].u=d2[i].u=i;
ans+=(2.0*dis(tx,ty,x,y));
}
sort(d1,d1+n,cmp);
sort(d2,d2+n,cmp);
double res=inf;
for(int i=0;i<n;i++)//枚举A选择的bot,排好序能快速算出最小的b
{
for(int j=0;j<2;j++)//防止bot(i)==bot(j)
{
if(d1[i].u!=d2[j].u)
{
res=min(res,d1[i].d+d2[j].d);
break;
}
}
}
double ans2=ans,res2=inf;
ans=ans+res;
//特判:其中一个人一个都没捡 捡的人肯定挑最少的捡
res2=min(d1[0].d,d2[0].d);
ans2=ans2+res2;
printf("%.12lf\n",min(ans,ans2));
return 0;
}