#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;
}