#include<bits/stdc++.h>
using namespace std;

struct data{
    int y,x,cost;
    data(int a,int b,int c):y(a),x(b),cost(c){}
    bool operator<(const data &d)const{
        return cost>d.cost;
    }
};
const int dx[]={-1,0,1,-1,1,-1,0,1};
const int dy[]={-1,-1,-1,0,0,1,1,1};

const int INF=1001001001;
int H,W,N,sx,sy;
int L[5];
int px[5][50],py[5][50];

int fld[20][20];
int dist[20][20][20][20];

void getDist(int ssy,int ssx){
    for(int i=0;i<H;i++){
        for(int j=0;j<W;j++){
            dist[ssy][ssx][i][j]=INF;
        }
    }

    if(fld[ssy][ssx])return;

    dist[ssy][ssx][ssy][ssx]=0;

    priority_queue<data>Q;
    Q.push(data(ssy,ssx,0));

    while(Q.size()){
        data d=Q.top();Q.pop();
        if(dist[ssy][ssx][d.y][d.x]<d.cost)continue;

        for(int i=0;i<8;i++){
            int ny=d.y+dy[i];
            int nx=d.x+dx[i];
            if(ny<0||ny>=H||nx<0||nx>=W||fld[ny][nx])continue;
            if(dist[ssy][ssx][ny][nx]<=d.cost+1)continue;
            dist[ssy][ssx][ny][nx]=d.cost+1;
            Q.push(data(ny,nx,d.cost+1));
        }
    }

}

int calc(vector<int>p){
    bool dp[2][50]={{0}};
    dp[0][0]=true;

    //for(int i=0;i<p.size();i++)cout<<p[i]<<" ";cout<<endl;
    for(int i=0;i<N;i++){
        //for(int j=0;j<H+W;j++)cout<<dp[i&1][j]<<" ";cout<<endl;
        for(int j=0;j<(i?L[p[i-1]]-1:1);j++){
            int cy=(i?py[p[i-1]][j]:sy);
            int cx=(i?px[p[i-1]][j]:sx);
            if(dp[i&1][j]==false)continue;
            for(int k=0;k<L[p[i]]-1;k++){
                int ny=py[p[i]][k];
                int nx=px[p[i]][k];
                if(k>=dist[cy][cx][ny][nx]+j){
                    dp[(i+1)&1][k]=true;
                }
                //cout<<ny<<" "<<nx<<"<---"<<cy<<" "<<cx<<endl;
            }
            dp[i&1][j]=false;
        }
    }
    //for(int i=0;i<H+W;i++)cout<<dp[N&1][i]<<" ";cout<<endl;
    for(int i=0;i<50;i++)if(dp[N&1][i])return i;
    return INF;
}

int main(){
    cin>>W>>H>>N>>sx>>sy;sx--;sy--;
    for(int i=0;i<N;i++){
        cin>>L[i];
        for(int j=0;j<L[i];j++){
            cin>>px[i][j]>>py[i][j];
            px[i][j]--;py[i][j]--;
        }
        fld[py[i][L[i]-1]][px[i][L[i]-1]]=1;
    }

    for(int i=0;i<H;i++){
        for(int j=0;j<W;j++){
            getDist(i,j);
        }
    }
    int ans=INF;
    vector<int>p;
    for(int i=0;i<N;i++)p.push_back(i);
    do{
        ans=min(calc(p),ans);
    }while(next_permutation(p.begin(),p.end()));

    if(ans==INF)cout<<-1<<endl;
    else cout<<ans<<endl;
    return 0;
}