#include <fstream>
#include <algorithm>
#include <iomanip>
#include <cmath>
using namespace std;
ifstream cin("parc.in");
ofstream cout("parc.out");
const int mxN = 3e4;
typedef long double ld;
int vert[mxN+10],oriz[mxN+10], l, r;
int main()
{
// Citim datele problemei
int latime , inaltime;
cin >> latime >> inaltime ;
int xStart,yStart;
cin >> xStart >> yStart;
int xFinal,yFinal;
cin >> xFinal >> yFinal;
int nrVert, nrOriz;
cin >> nrVert;
for(int i = 1;i <= nrVert;i++)
{
cin >> l >> r;
if(l > r) swap(l,r);
r--;
for(int it = l;it<=r;it++)
vert[it] = 1;
}
cin >> nrOriz;
for(int i = 1;i<=nrOriz;i++)
{
cin >> l >> r;
if(l > r) swap(l,r);
r--;
for(int it = l;it<=r;it++)
oriz[it] = 1;
}
// Cerinta 1
bool swappedX = false, swappedY = false;
if(xStart > xFinal) swappedX = true, swap(xStart,xFinal);
if(yStart > yFinal) swappedY = true, swap(yStart,yFinal);
int latimeDif = xFinal - xStart, inaltimeDif = yFinal - yStart, cntGri = 0;
for(int i = xStart;i <= xFinal; i++)
latimeDif -= vert[i], cntGri += vert[i];
for(int i = yStart;i <= yFinal;i++)
inaltimeDif -= oriz[i], cntGri += oriz[i];
ld d = latimeDif * latimeDif + inaltimeDif * inaltimeDif;
cout << fixed << setprecision(10) << cntGri + sqrtl(d) << '\n';
// Cerinta 2
if(swappedX)
{
swap(xStart,xFinal);
xStart = latime - xStart;
xFinal = latime - xFinal;
reverse(vert,vert+latime);
}
if(swappedY)
{
swap(yStart,yFinal);
yStart = inaltime - yStart;
yFinal = inaltime - yFinal;
reverse(oriz,oriz + inaltime);
}
for(int i = 1;i<=latime;i++) // efectuam sume partiale.
vert[i]+=vert[i-1];
for(int i = 1;i<=inaltime;i++)
oriz[i] += oriz[i-1];
int gcd = __gcd(inaltimeDif,latimeDif), nrDrumuri = 1;
int dx = latimeDif / gcd, dy = inaltimeDif / gcd;
// cautare binara pentru coordonatele punctelor laticiale.
for(int i = 1;i<gcd;i++)
{
int targetX = dx * i, targetY = dy * i;
int l = xStart, r = xFinal, pref = 0, sol = -1;
if(xStart != 0) pref = vert[xStart-1];
while(l <= r)
{
int mid = (l + r) / 2;
int nrGri = vert[mid] - pref, total = mid - xStart + 1;
int nrAlbe = total - nrGri;
if(nrAlbe == targetX)
sol = mid;
if(nrAlbe > targetX)
r = mid-1;
else l = mid+1;
}
int pozX = sol;
l = yStart, r = yFinal, pref = 0, sol = -1;
if(yStart != 0) pref = oriz[yStart-1];
while(l <= r)
{
int mid = (l + r) / 2;
int nrGri = oriz[mid] - pref, total = mid - yStart + 1;
int nrAlbe = total - nrGri;
if(nrAlbe == targetY)
sol = mid;
if(nrAlbe > targetY)
r = mid-1;
else l = mid+1;
}
int pozY = sol;
if(pozX != -1 && pozY != -1 && vert[pozX] - vert[pozX-1] && oriz[pozY] - oriz[pozY-1])
nrDrumuri*=2;
}
cout << nrDrumuri << '\n';
return 0;
}