// queen problem
// 2005 ECNA ACM contest
// t feil

#include <iostream>
using namespace std;

int rows, cols, B[1001][1001];

void GetQueens(){
  int n,r,c;

  //clean board
  for(int i=1;i<=rows;i++)
    for(int j=1;j<=cols;j++)
      B[i][j]=0;

  cin>>n;
  for(int i=0;i<n;i++){
    cin>>r>>c;
    B[r][c]=1;
  } 
}

void GetKnights(){
  int r,c,n;

  cin>>n;
  for(int i=0;i<n;i++){
    cin>>r>>c;
    B[r][c]=2;
  } 
}

void GetPawns(){
  int r,c,n;

  cin>>n;
  for(int i=0;i<n;i++){
    cin>>r>>c;
    B[r][c]=3;
  } 
}

void MarkQueen(int i, int j){
  int r,c;

  //queen attack
  //horizontal  move
  c=j+1;	//move right
  while(c<=cols){
    if(B[i][c]==0) B[i][c]=-1;
    if(B[i][c]==3 || B[i][c]==2) c=cols+1;     //blocked
    c++;
  } 
  c=j-1;	//moveleft 
  while(c>0){
    if(B[i][c]==0) B[i][c]=-1;
    if(B[i][c]==3 || B[i][c]==2) c=0;     //blocked
    c--;
  } 
  //vertical search
  r=i+1;	//move down
  while(r<=rows){
    if(B[r][j]==0) B[r][j]=-1;
    if(B[r][j]==3 || B[r][j]==2) r=rows+1;     //blocked
    r++;
  } 
  r=i-1;	//move up
  while(r>0){
    if(B[r][j]==0) B[r][j]=-1;
    if(B[r][j]==3 || B[r][j]==2) r=0;     //blocked
    r--;
 }
  //NW-SE diag?
  r=i+1; c=j+1;
  while(c<=cols && r<=rows){
    if(B[r][c]==0) B[r][c]=-1;
    if(B[r][c]==3 || B[r][c]==2) r=rows+1;     //blocked
    r++; c++; 
  } 
  r=i-1; c=j-1;
  while(c>0 && r>0){
    if(B[r][c]==0) B[r][c]=-1;
    if(B[r][c]==3 || B[r][c]==2) r=0;     //blocked
    r--; c--; 
  } 
  //NE-SW diag?
  r=i-1; c=j+1;
  while(c<=cols && r>0){
    if(B[r][c]==0) B[r][c]=-1;
    if(B[r][c]==3 || B[r][c]==2) r=0;     //blocked
    r--; c++; 
  } 
  r=i+1; c=j-1;
  while(c>0 && r<=rows){
    if(B[r][c]==0) B[r][c]=-1;
    if(B[r][c]==3 || B[r][c]==2) c=0;     //blocked
    r++; c--; 
  } 

}

void MarkKnight(int i, int j){
  //knight attacks 
  if(i-2>0 && j-1>0 && B[i-2][j-1]==0) B[i-2][j-1]=-1;
  if(i-1>0 && j-2>0 && B[i-1][j-2]==0) B[i-1][j-2]=-1;
  if(i+1<=rows && j-2>0 && B[i+1][j-2]==0) B[i+1][j-2]=-1;
  if(i+2<=rows && j-1>0 && B[i+2][j-1]==0) B[i+2][j-1]=-1;
  if(i+2<=rows && j+1<=cols && B[i+2][j+1]==0)  B[i+2][j+1]=-1;
  if(i+1<=rows && j+2<=cols && B[i+1][j+2]==0)  B[i+1][j+2]=-1;
  if(i-1>0 && j+2<=cols && B[i-1][j+2]==0) B[i-1][j+2]=-1;
  if(i-2>0 && j+1<=cols && B[i-2][j+1]==0)  B[i-2][j+1]=-1;

}

int main(){
  int count, board=1;
 
  cin>>rows>>cols;
  while(rows>0){
    GetQueens();
    GetKnights();
    GetPawns();

/*    for(int i=1;i<=rows;i++){
      for(int j=1;j<=cols;j++)
        cout<<B[i][j];
      cout<<endl;
    }
cout<<endl;
*/

    for(int i=1;i<=rows;i++)
      for(int j=1;j<=cols;j++) {
        if(B[i][j]==1) MarkQueen(i,j);      //mark squares atacked by queen
        if(B[i][j]==2) MarkKnight(i,j);     //mark squares atacked by knight
      }


/*    for(int i=1;i<=rows;i++){
      for(int j=1;j<=cols;j++)
        cout<<B[i][j];
      cout<<endl;
    }
cout<<"*"<<endl;
*/

    count=0;
    for(int i=1;i<=rows;i++)
      for(int j=1;j<=cols;j++) 
        if(B[i][j]==0) count++;    //safe square
  
    cout<<"Board "<<board++<<" has "<<count<<" safe squares."<<endl;

   cin>>rows>>cols;
  } 

return 0;
}
