#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int H, W, n, p, q;
char puzzle[20][20];
char tmp[20][20];
bool used[20][20];
char pieces[10][20][20];
int pSizeH[10], pSizeW[10];
int area[10];
vector<int> comp;
vector<int> c_size;

int const INF = 1000000000;

bool setP(int y, int x, int p){
  for(int i=0;i<pSizeH[p];i++){
    for(int j=0;j<pSizeW[p];j++){
      if(pieces[p][i][j] == '#'){
	y -= i;
	x -= j;
	i = INF;
	break;
      }
    }
  }
  for(int i=0;i<pSizeH[p];i++){
    for(int j=0;j<pSizeW[p];j++){
      if(y+i<0 || y+i>=H) return false;
      if(x+j<0 || x+j>=W) return false;
      if(pieces[p][i][j] == '#' && tmp[y+i][x+j] == '#') return false;
    }
  }
  for(int i=0;i<pSizeH[p];i++){
    for(int j=0;j<pSizeW[p];j++){
      if(pieces[p][i][j] == '#') tmp[y+i][x+j] = '#', used[y+i][x+j] = true;
    }
  }
  return true;
}

bool setRotate90P(int y, int x, int p){
  for(int i=0;i<pSizeW[p];i++){
    for(int j=0;j<pSizeH[p];j++){
      if(pieces[p][j][pSizeW[p]-i-1] == '#'){
	y -= i;
	x -= j;
	i = INF;
	break;
      }
    }
  }
  for(int i=0;i<pSizeW[p];i++){
    for(int j=0;j<pSizeH[p];j++){
      if(y+i<0 || y+i>=H) return false;
      if(x+j<0 || x+j>=W) return false;
      if(pieces[p][j][pSizeW[p]-i-1] == '#' && tmp[y+i][x+j] == '#') return false;
    }
  }
  for(int i=0;i<pSizeW[p];i++){
    for(int j=0;j<pSizeH[p];j++){
      if(pieces[p][j][pSizeW[p]-i-1] == '#') tmp[y+i][x+j] = '#', used[y+i][x+j] = true;
    }
  }
  return true;
}

bool setRotate180P(int y, int x, int p){
  for(int i=0;i<pSizeH[p];i++){
    for(int j=0;j<pSizeW[p];j++){
      if(pieces[p][pSizeH[p]-i-1][pSizeW[p]-j-1] == '#'){
	y -= i;
	x -= j;
	i = INF;
	break;
      }
    }
  }
  for(int i=0;i<pSizeH[p];i++){
    for(int j=0;j<pSizeW[p];j++){
      if(y+i<0 || y+i>=H) return false;
      if(x+j<0 || x+j>=W) return false;
      if(pieces[p][pSizeH[p]-i-1][pSizeW[p]-j-1] == '#' && tmp[y+i][x+j] == '#') return false;
    }
  }
  for(int i=0;i<pSizeH[p];i++){
    for(int j=0;j<pSizeW[p];j++){
      if(pieces[p][pSizeH[p]-i-1][pSizeW[p]-j-1] == '#') tmp[y+i][x+j] = '#', used[y+i][x+j] = true;
    }
  }
  return true;
}

bool setRotate270P(int y, int x, int p){
  for(int i=0;i<pSizeW[p];i++){
    for(int j=0;j<pSizeH[p];j++){
      if(pieces[p][pSizeH[p]-j-1][i] == '#'){
	y -= i;
	x -= j;
	i = INF;
	break;
      }
    }
  }
  for(int i=0;i<pSizeW[p];i++){
    for(int j=0;j<pSizeH[p];j++){
      if(y+i<0 || y+i>=H) return false;
      if(x+j<0 || x+j>=W) return false;
      if(pieces[p][pSizeH[p]-j-1][i] == '#' && tmp[y+i][x+j] == '#') return false;
    }
  }
  for(int i=0;i<pSizeW[p];i++){
    for(int j=0;j<pSizeH[p];j++){
      if(pieces[p][pSizeH[p]-j-1][i] == '#') tmp[y+i][x+j] = '#', used[y+i][x+j] = true;
    }
  }
  return true;
}

void rSetP(int y, int x, int p){
  for(int i=0;i<pSizeH[p];i++){
    for(int j=0;j<pSizeW[p];j++){
      if(pieces[p][i][j] == '#'){
	y -= i;
	x -= j;
	i = INF;
	break;
      }
    }
  }
  for(int i=0;i<pSizeH[p];i++){
    for(int j=0;j<pSizeW[p];j++){
      if(pieces[p][i][j] == '#') tmp[y+i][x+j] = '.';
    }
  }
}

void rSetRotate90P(int y, int x, int p){
  for(int i=0;i<pSizeW[p];i++){
    for(int j=0;j<pSizeH[p];j++){
      if(pieces[p][j][pSizeW[p]-i-1] == '#'){
	y -= i;
	x -= j;
	i = INF;
	break;
      }
    }
  }
  for(int i=0;i<pSizeW[p];i++){
    for(int j=0;j<pSizeH[p];j++){
      if(pieces[p][j][pSizeW[p]-i-1] == '#') tmp[y+i][x+j] = '.';
    }
  }
}

void rSetRotate180P(int y, int x, int p){
  for(int i=0;i<pSizeH[p];i++){
    for(int j=0;j<pSizeW[p];j++){
      if(pieces[p][pSizeH[p]-i-1][pSizeW[p]-j-1] == '#'){
	y -= i;
	x -= j;
	i = INF;
	break;
      }
    }
  }
  for(int i=0;i<pSizeH[p];i++){
    for(int j=0;j<pSizeW[p];j++){
      if(pieces[p][pSizeH[p]-i-1][pSizeW[p]-j-1] == '#') tmp[y+i][x+j] = '.';
    }
  }
}

void rSetRotate270P(int y, int x, int p){  
  for(int i=0;i<pSizeW[p];i++){
    for(int j=0;j<pSizeH[p];j++){
      if(pieces[p][pSizeH[p]-j-1][i] == '#'){
	y -= i;
	x -= j;
	i = INF;
	break;
      }
    }
  }
  for(int i=0;i<pSizeW[p];i++){
    for(int j=0;j<pSizeH[p];j++){
      if(pieces[p][pSizeH[p]-j-1][i] == '#') tmp[y+i][x+j] = '.';
    }
  }
}

void printtmp(){
  for(int i=0;i<H;i++){
    for(int j=0;j<W;j++){
      cout << tmp[i][j];
    }
    cout << endl;
  }
  cout << endl;
}

bool check(int selectedP){
  fill(used[0], used[20], false);
  for(int i=0;i<H;i++){
    for(int j=0;j<W;j++){
      if(tmp[i][j] != '.'){
	used[i][j] = true;
	continue;
      }
      if(tmp[i][j]) continue;
      for(int k=0;k<n;k++){
	if((1<<k) & selectedP){
	  if(setP(i, j, k)){
	    rSetP(i, j, k);
	    return true;
	  }
	  if(setRotate90P(i, j, k)){
	    rSetRotate90P(i, j, k);
	    return true;
	  }
	  if(setRotate180P(i, j, k)){
	    rSetRotate180P(i, j, k);
	    return true;
	  }
	  if(setRotate270P(i, j, k)){
	    rSetRotate270P(i, j, k);
	    return true;
	  }
	}
      }
    }
  }
  /*for(int i=0;i<H;i++){
    for(int j=0;j<W;j++){
      if(!used[i][j]) return false;
    }
    }*/
  return true;
}

bool solve(int selectedP){
  bool f = true;
  int cnt = 0;
  for(int i=0;i<H;i++){
    for(int j=0;j<W;j++){
      if(tmp[i][j] == '.') cnt++;
    }
  }
  int sum = 0;
  for(int i=0;i<n;i++){
    if((1<<i) & selectedP) sum += area[i];
  }
  if(cnt > sum) return false;
  for(int i=0;i<H;i++){
    for(int j=0;j<W;j++){
      if(tmp[i][j] != '.') continue;
      f = false;
      for(int k=0;k<n;k++){
	if((1<<k) & selectedP){
	  int next = (selectedP & ~(1<<k));
	  if(setP(i, j, k)){
	    if(check(next)){
	      if(solve(next)) return true;
	    }
	    rSetP(i, j, k);
	  }
	  if(setRotate90P(i, j, k)){
	    if(check(next)){
	      if(solve(next)) return true;
	    }
	    rSetRotate90P(i, j, k);
	  }
	  if(setRotate180P(i, j, k)){
	    if(check(next)){
	      if(solve(next)) return true;
	    }
	    rSetRotate180P(i, j, k);
	  }
	  if(setRotate270P(i, j, k)){
	    if(check(next)){
	      if(solve(next)) return true;
	    }
	    rSetRotate270P(i, j, k);
	  }
	}
      }
    }
  }
  if(!f) return false;
  for(int i=0;i<n;i++){
    if((1<<i) & selectedP) return false;
  }
  return true;
}

main(){
  while(cin >> H >> W){
    if(H == 0 && W == 0) break;
    for(int i=0;i<H;i++){
      for(int j=0;j<W;j++){
	cin >> puzzle[i][j];
      }
    }
    cin >> n;
    fill(area, area+10, 0);
    for(int i=0;i<n;i++){
      cin >> pSizeH[i] >> pSizeW[i];
      for(int j=0;j<pSizeH[i];j++){
	for(int k=0;k<pSizeW[i];k++){
	  cin >> pieces[i][j][k];
	  if(pieces[i][j][k] == '#'){
	    ++area[i];
	  }
	}
      }
    }
    comp.clear();
    cin >> p;
    for(int i=0;i<p;i++){
      cin >> q;
      int selectedP = 0;
      for(int j=0;j<H;j++){
	for(int k=0;k<W;k++){
	  tmp[j][k] = puzzle[j][k];
	}
      }
      for(int j=0;j<q;j++){
	int input;
	cin >> input;
	selectedP += (1<<(input-1));
      }
      bool f = false;
      bool f2 = false;
      for(int j=0;j<c_size.size();j++){
	if(comp[j] == selectedP){
	  f = true;
	  break;
	}
	if(c_size[j] < q){
	  f2 = true;
	  for(int k=0;k<n;k++){
	    if((1<<k) & comp[j]){
	      if(!((1<<k) & selectedP)){
		f2 = false;
		break;
	      }
	    }
	  }
	  if(f2){
	    cout << "NO" << endl;
	    break;
	  }
	}
      }
      if(f2) continue;
      if(f){
	cout << "YES" << endl;
	continue;
      }
      if(solve(selectedP)){
	c_size.push_back(q);
	comp.push_back(selectedP);
	cout << "YES" << endl;
      }else cout << "NO" << endl;
    }
  }
  return 0;
}