#include <cstdio>
#include <cmath>
#include <vector>
#include <utility>
#include <algorithm>
#define adevaratadevarat true
#define punct std::pair <int, int>
#define x first
#define y second
#define INF 1000000000
#define EPS 0.00000001
#define MAXN 10
#define MAXM 25
#define MAXU 500
#define MAXK 1010
#define MASK 1023
struct muchie{
int x;
double y;
muchie(int _x, double _y){
x=_x;
y=_y;
}
};
punct r[MAXN], o[MAXM][MAXU+MAXN], a[MAXK], sol[MAXK*MAXK];
int u[MAXM], h[MASK+1];
bool viz[MAXK];
std::vector <muchie> v[MAXK];
double d[MAXK];
inline int myabs(int a){
if(a<0) return -a;
else return a;
}
inline int arie(punct a, punct b, punct c){
return a.x*b.y-a.y*b.x+b.x*c.y-b.y*c.x+c.x*a.y-c.y*a.x;
}
inline double dist(punct a, punct b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
inline bool intersect(punct a, punct b, punct p, punct q){
if((a==p)||(a==q)||(b==p)||(b==q)) return 0;
if(std::max(std::min(a.x, b.x), std::min(p.x, q.x))>std::min(std::max(a.x, b.x), std::max(p.x, q.x))) return 0;
if(std::max(std::min(a.y, b.y), std::min(p.y, q.y))>std::min(std::max(a.y, b.y), std::max(p.y, q.y))) return 0;
long long s1=arie(a, b, p), s2=arie(a, b, q), s3=arie(p, q, a), s4=arie(p, q, b);
return ((((s1<0)&&(s2>0))||((s1>0)&&(s2<0)))&&(((s3<0)&&(s4>0))||((s3>0)&&(s4<0))));
}
inline bool peLinie(punct q, punct a, punct b){
return (std::fabs(dist(a, b)-dist(a, q)-dist(q, b))<EPS);
}
inline bool punctInPoligon(punct Ion, punct v[], int n){
for(int i=0; i<n; i++)
if(Ion==v[i])
return 0;
if(peLinie(Ion, v[n-1], v[0])) return 0;
for(int i=1; i<n; i++)
if(peLinie(Ion, v[i-1], v[i]))
return 0;
int arie1=0, arie2=myabs(arie(Ion, v[n-1], v[0]));
for(int i=1; i<n; i++)
arie2+=myabs(arie(Ion, v[i-1], v[i]));
for(int i=2; i<n; i++)
arie1+=arie(v[0], v[i-1], v[i]);
return (arie1==arie2);
}
inline bool corect(punct a, punct b, int m){
for(int i=0; i<m; i++){
if(punctInPoligon(a, o[i], u[i])) return 0;
if(punctInPoligon(b, o[i], u[i])) return 0;
for(int j=0; j<u[i]; j++)
for(int p=j+1; p<u[i]; p++)
if(intersect(a, b, o[i][j], o[i][p]))
return 0;
}
return adevaratadevarat;
}
inline void convexHull(punct v[], int n, punct st[], int &vf){
std::sort(v, v+n);
vf=1;
st[0]=v[0];
for(int i=1; i<n; i++){
if(arie(v[0], v[i], v[n-1])>=0){
while((vf>1)&&(arie(st[vf-2], st[vf-1], v[i])<=0))
vf--;
st[vf++]=v[i];
}
}
for(int i=n-1; i>0; i--){
if(arie(v[0], v[i], v[n-1])<0){
while((vf>1)&&(arie(st[vf-2], st[vf-1], v[i])<=0))
vf--;
st[vf++]=v[i];
}
}
while((vf>1)&&(arie(st[vf-2], st[vf-1], v[0])<=0))
vf--;
}
inline void extind(punct a[], int &t, int n, punct q){
int k=0;
for(int i=0; i<n; i++){
for(int j=0; j<t; j++){
sol[k].x=q.x+a[j].x-r[i].x;
sol[k].y=q.y+a[j].y-r[i].y;
k++;
}
}
convexHull(sol, k, a, t);
}
int main(){
FILE *fin, *fout;
fin=fopen("robot.in", "r");
fout=fopen("robot.out", "w");
int n;
fscanf(fin, "%d", &n);
for(int i=0; i<n; i++)
fscanf(fin, "%d%d", &r[i].x, &r[i].y);
int m;
fscanf(fin, "%d", &m);
for(int i=0; i<m; i++){
fscanf(fin, "%d", &u[i]);
for(int j=0; j<u[i]; j++)
fscanf(fin, "%d%d", &o[i][j].x, &o[i][j].y);
}
punct f;
fscanf(fin, "%d%d", &f.x, &f.y);
punct q=r[0];
for(int i=1; i<n; i++){
if(r[i].x<q.x) q.x=r[i].x;
if(r[i].y<q.y) q.y=r[i].y;
}
for(int i=0; i<m; i++)
extind(o[i], u[i], n, q);
a[0]=q;
a[1]=f;
int k=2;
for(int i=0; i<m; i++)
for(int j=0; j<u[i]; j++)
a[k++]=o[i][j];
for(int i=0; i<k; i++){
for(int j=i+1; j<k; j++){
if(corect(a[i], a[j], m)){
v[i].push_back(muchie(j, dist(a[i], a[j])));
v[j].push_back(muchie(i, dist(a[i], a[j])));
}
}
}
for(int i=1; i<k; i++)
d[i]=INF;
int st=0, dr=0;
h[dr++]=0;
viz[0]=1;
while(st<dr){
int x=h[st&MASK];
viz[x]=0;
st++;
for(auto y:v[x]){
if(d[x]+y.y<d[y.x]){
d[y.x]=d[x]+y.y;
if(!viz[y.x]){
viz[y.x]=1;
h[dr&MASK]=y.x;
dr++;
}
}
}
}
if(d[1]>INF/2) fprintf(fout, "-1\n");
else fprintf(fout, "%.2f\n", d[1]);
fclose(fin);
fclose(fout);
return 0;
}