#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int NN=1100; const int MM=4000000; const int INF=100000000; int n,a,b,diss; int d[NN],hate[NN][2],love[NN][2]; struct Edge{ int v,next; }e[MM]; int en,ee,head[NN],cur[NN]; void add(int u,int v) { e[en].v=v; e[en].next=head[u]; head[u]=en++; } inline int Abs(int x) { if (x>=0) return x; else return -x; } inline int dis(int x1,int y1,int x2,int y2) { return Abs(x1-x2)+Abs(y1-y2); } void init() { int x,y,x1,x2,y1,y2; en=0; memset(head,-1,sizeof(head)); scanf("%d%d%d",&n,&a,&b); scanf("%d%d%d%d",&x1,&y1,&x2,&y2); diss=dis(x1,y1,x2,y2); for (int i=1; i<=n; i++) { scanf("%d%d",&x,&y); d[i]=dis(x,y,x1,y1); d[i+n]=dis(x,y,x2,y2); } for (int i=1; i<=a; i++) scanf("%d%d",&hate[i][0],&hate[i][1]); for (int i=1; i<=b; i++) scanf("%d%d",&love[i][0],&love[i][1]); } int bn,top,index,dfn[NN],low[NN],belong[NN],stack[NN]; bool instack[NN]; void tarjan(int u) { dfn[u]=low[u]=++index; stack[++top]=u; instack[u]=true; int v; for (int i=head[u]; i!=-1; i=e[i].next) { v=e[i].v; if (!dfn[v]) { tarjan(v); if (low[v]<low[u]) low[u]=low[v]; } else if (instack[v] && dfn[v]<low[u]) low[u]=dfn[v]; } if (low[u]==dfn[u]) { bn++; do { v=stack[top--]; instack[v]=false; belong[v]=bn; }while (v!=u); } } bool ok(int m) { en=0; for (int i=1; i<=2*n; i++) head[i]=-1; int x,y; for (int i=1; i<=a; i++) { x=hate[i][0],y=hate[i][1]; add(x,y+n); add(y,x+n); add(x+n,y); add(y+n,x); } for (int i=1; i<=b; i++) { x=love[i][0],y=love[i][1]; add(x,y); add(y,x); add(x+n,y+n); add(y+n,x+n); } for (int i=1; i<n; i++) for (int j=i+1; j<=n; j++) { if (d[i]+d[j]>m) { add(i,j+n); add(j,i+n); } if (d[i+n]+d[j+n]>m) { add(i+n,j); add(j+n,i); } if (d[i]+d[j+n]+diss>m) { add(i,j); add(j+n,i+n); } if (d[i+n]+d[j]+diss>m) { add(j,i); add(i+n,j+n); } } top=index=bn=0; for (int i=1; i<=2*n; i++) dfn[i]=0; for (int i=1; i<=2*n; i++) if (!dfn[i]) tarjan(i); for (int i=1; i<=n; i++) { if (belong[i]==belong[i+n]) return false; } return true; } void solve() { if (!ok(INF)) { printf("-1\n"); return; } int ans,m,l=0,r=4000000; while (l<=r) { int m=(l+r)/2; if (ok(m)) r=m-1,ans=m; else l=m+1; } printf("%d\n",ans); } int main() { init(); solve(); return 0; }