//ford算法
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<math.h>
struct EdgeNode
{
int a;
int b;
} E[11111];
struct VexNode
{
int x;
int y;
} V[111];
int n, m;
void ford(int s, int t)
{
int i, j;
double dis[111];//
for(i = 1;i<= n;i++) dis[i] = 10000000000;//初始化
dis[s] = 0;//初始化
for(i = 0; i< n-1; i++)
{
for(j = 1; j <= m; j++)
{
int a = E[j].a;
int b = E[j].b;
double di = sqrt(pow(V[a].x-V[b].x,2)+pow(V[a].y- V[b].y,2));
if(dis[b]>dis[a]+ di)
{
dis[b] = dis[a]+di;
}
if(dis[a]> dis[b]+di)
{
dis[a] = dis[b]+di;
}
}
}
for(j = 1; j <= m; j++)
{
int a = E[j].a;
int b = E[j].b;
double di = sqrt(pow(V[a].x-V[b].x,2)+pow(V[a].y- V[b].y,2));
if(dis[b]>dis[a]+ di)
{
dis[b] = dis[a]+di;
}
if(dis[a]> dis[b]+di)
{
dis[a] = dis[b]+di;
}
}
printf("%.2lf", dis[t]);
}
int main()
{
int i;
scanf("%d", &n);
for(i = 1; i <=n; i++)
{
int x, y;
scanf("%d %d", &x, &y);
V[i].x = x;
V[i].y = y;
}
scanf("%d", &m);
for(i = 1; i<= m; i++)
{
scanf("%d %d", &E[i].a, &E[i].b);
}
int s, t;
scanf("%d %d", &s, &t);
ford(s, t);
return 0;
}