#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <iostream>
#include <set>
#include <map>
#include <time.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


struct Data{
	Data(){
		row = col = 0;
	}
	Data(int arg_row,int arg_col){
		row = arg_row;
		col = arg_col;
	}
	int row,col;
};

struct Info{
	Info(int arg_state,int arg_row,int arg_col,int arg_time){
		state = arg_state;
		row = arg_row;
		col = arg_col;
		time = arg_time;
	}
	int state,row,col,time;
};

int W,H,N;
int num_path[5];
bool state_check[20][20][32][41];
int diff_row[9] = {-1,-1,-1,0,0,0,1,1,1},diff_col[9] = {-1,0,1,-1,0,1,-1,0,1};
bool bomb_check[20][20];
Data path[5][40];

bool rangeCheck(int row,int col){
	if(row >= 0 && row <= H-1 && col >= 0 && col <= W-1){
		return true;
	}else{
		return false;
	}
}

int main(){

	int POW[6];
	for(int i = 0; i < 6; i++)POW[i] = pow(2,i);


	scanf("%d %d %d",&W,&H,&N);

	int start_col,start_row;
	scanf("%d %d",&start_col,&start_row);
	start_col--;
	start_row--;

	for(int row = 0; row < H; row++){
		for(int col = 0; col < W; col++)bomb_check[row][col] = false;
	}

	for(int i = 0; i < N; i++){
		scanf("%d",&num_path[i]);

		for(int k = 0; k < num_path[i]; k++){
			scanf("%d %d",&path[i][k].col,&path[i][k].row);
			path[i][k].col--;
			path[i][k].row--;
			if(k == num_path[i]-1){
				bomb_check[path[i][k].row][path[i][k].col] = true;
			}
		}
	}

	for(int row = 0; row < H; row++){
		for(int col = 0; col < W; col++){
			for(int state = 0; state < POW[N]; state++){
				for(int time = 0; time <= 40; time++)state_check[row][col][state][time] = false;
			}
		}
	}

	int first_state = 0;
	for(int i = 0; i < N; i++){
		if(path[i][0].row == start_row && path[i][0].col == start_col){
			first_state += POW[i];
		}
	}

	state_check[start_row][start_col][first_state][0] = true;

	queue<Info> Q;
	Q.push(Info(first_state,start_row,start_col,0));

	int ans = -1;
	int adj_row,adj_col,next_time,add_state;
	bool FLG;

	while(!Q.empty()){

		if(Q.front().state == POW[N]-1){
			ans = Q.front().time;
			break;
		}else{

			next_time = Q.front().time+1;

			FLG = true;
			for(int loop = 0; loop < N; loop++){
				if(Q.front().state & (1 << loop)){
					//Do nothing
				}else{
					if(next_time == num_path[loop]-1){
						FLG = false;
						break;
					}
				}
			}

			if(!FLG){
				Q.pop();
				continue;
			}

			for(int i = 0; i < 9; i++){
				adj_row = Q.front().row+diff_row[i];
				adj_col = Q.front().col+diff_col[i];

				if(rangeCheck(adj_row,adj_col) == false || bomb_check[adj_row][adj_col] == true)continue;

				add_state = 0;

				for(int loop = 0; loop < N; loop++){
					if(Q.front().state & (1 << loop)){
						//Do nothing
					}else{
						if(path[loop][next_time].row == adj_row && path[loop][next_time].col == adj_col){
							add_state += POW[loop];
						}
					}
				}
				if(state_check[adj_row][adj_col][Q.front().state+add_state][next_time])continue;

				state_check[adj_row][adj_col][Q.front().state+add_state][next_time] = true;

				Q.push(Info(Q.front().state+add_state,adj_row,adj_col,next_time));
			}
			Q.pop();
		}
	}

	printf("%d\n",ans);

    return 0;
}



Measured memory_bytes: 4076