// Pizza Boxes -- mjd@cs.auckland.ac.nz
//
#include <iostream>
#include <utility>
#include <string>
#include <vector>
#include <algorithm>
#include <set>

using namespace std;

int n, m;  // n = #rows, m = #cols
inline int at(int i, int j) { return i*m+j; }

enum { UNKNOWN, EMPTY, FILLED };

void printboxes(int b[])
{
   for(int i = 0; i < n; i++) // output board
   {
     for (int j=0; j < m; j++)
     {
         if (b[at(i,j)]==UNKNOWN) { cout << 'u'; continue; }
         cout << (b[at(i,j)]==FILLED ? '#' : '-');
     }
     cout << endl;
   }
   cout << endl;
}


int countrow(int b[], int i, int val)
{
  int cnt=0;
  for (int j=0; j<m; j++) if (b[at(i,j)]==val) cnt++;
  return cnt;
}
int countcol(int b[], int j, int val)
{
  int cnt=0;
  for (int i=0; i<n; i++) if (b[at(i,j)]==val) cnt++;
  return cnt;
}
int countup(int b[], int u, int val)
{
  int cnt=0;
  int i, j;
  if (u<n) { i = u; j = 0; }
  else     { i = n-1; j = u-n+1; } 
  for (int k=0; k<max(n,m); k++) 
  {
    if (i-k < 0 || j+k >= m) continue;
    if (b[at(i-k,j+k)]==val) cnt++;
  }
  return cnt;
}
int countdown(int b[], int d, int val)
{
  int cnt=0;
  int i, j;
  if (d<m) { i = 0; j = m-1-d; }
  else     { i = d-m+1; j = 0; } 
  for (int k=0; k<max(n,m); k++) 
  {
    if (i+k >= n || j+k >= m) continue;
    if (b[at(i+k,j+k)]==val) cnt++;
  }
  return cnt;
}
void setrow(int b[], int i, int val)
{
  for (int j=0; j<m; j++) if (b[at(i,j)]==UNKNOWN) b[at(i,j)]=val;
}
void setcol(int b[], int j, int val)
{
  for (int i=0; i<n; i++) if (b[at(i,j)]==UNKNOWN) b[at(i,j)]=val;
}
void setup(int b[], int u, int val)
{
  int i, j;
  if (u<n) { i = u; j = 0; }
  else     { i = n-1; j = u-n+1; } 
  for (int k=0; k<max(n,m); k++) 
  {
    if (i-k < 0 || j+k >= m) continue;
    if (b[at(i-k,j+k)]==UNKNOWN) b[at(i-k,j+k)]=val;
  }
}
void setdown(int b[], int d, int val)
{
  int i, j;
  if (d<m) { i = 0; j = m-1-d; }
  else     { i = d-m+1; j = 0; } 
  for (int k=0; k<max(n,m); k++) 
  {
    if (i+k >= n || j+k >= m) continue;
    if (b[at(i+k,j+k)]==UNKNOWN) b[at(i+k,j+k)]=val;
  }
}

bool issolved(int b[])
{
  for (int i=0; i<m*n; i++) if (b[i]==UNKNOWN) return false;
  return true;
}

bool propagate(int b[], 
  const vector<int> &r, const vector<int> &c, 
  const vector<int> &d, const vector<int> &u)
{
  bool changeFlg;
  do 
  {
    changeFlg = false;

    // row check
    for (int i=0; i<n; i++)
    {
      int q = countrow(b, i, UNKNOWN);
      if (q==0) continue;
      int f = countrow(b, i, FILLED);
      if (f==r[i])
      {
        changeFlg = true;
        setrow(b,i,EMPTY);
        continue;
      }
      if (q==r[i]-f)
      {
        changeFlg = true;
        setrow(b,i,FILLED);
      }
    }

    // col check
    for (int i=0; i<m; i++)
    {
      int q = countcol(b, i, UNKNOWN);
      if (q==0) continue;
      int f = countcol(b, i, FILLED);
      if (f==c[i])
      {
        changeFlg = true;
        setcol(b,i,EMPTY);
        continue;
      }
      if (q==c[i]-f)
      {
        changeFlg = true;
        setcol(b,i,FILLED);
      }
    }

    // up check
    for (int i=0; i<m+n-1; i++)
    {
      int q = countup(b, i, UNKNOWN);
      if (q==0) continue;
      int f = countup(b, i, FILLED);
      if (f==u[i])
      {
        changeFlg = true;
        setup(b,i,EMPTY);
        continue;
      }
      if (q==u[i]-f)
      {
        changeFlg = true;
        setup(b,i,FILLED);
      }
    }

    // down check
    for (int i=0; i<m+n-1; i++)
    {
      int q = countdown(b, i, UNKNOWN);
      if (q==0) continue;
      int f = countdown(b, i, FILLED);
      if (f==d[i])
      {
        changeFlg = true;
        setdown(b,i,EMPTY);
        continue;
      }
      if (q==d[i]-f)
      {
        changeFlg = true;
        setdown(b,i,FILLED);
      }
    }
  }
  while (changeFlg);
  return issolved(b);
}

bool solve(int b[], 
  const vector<int> &r, const vector<int> &c, 
  const vector<int> &d, const vector<int> &u, int k)
{
  if (!(k < m*n)) { cerr << "no solution!\n"; }

  bool ans = propagate(b, r, c, d, u); // first solution
  if (ans == true) return true;

tryagain:  // backtracking code that probably isn't required
  int k2=-1;
  for (int i=k; i<n; i++)
  {
    if (b[i]==UNKNOWN) { k2=i; break; }
  }
  if (k2==-1) return false;
   
  int *b2 = new int[m*n]; 
  copy(b,b+(m*n),b2);
  b2[k2] = EMPTY;
  ans = solve(b2, r, c, d, u, k2+1);
  delete [] b2;
  if (ans == true) { copy(b2,b2+(m*n),b); return true; }

  b2 = new int[m*n]; 
  copy(b,b+(m*n),b2);
  b2[k2] = FILLED;
  ans = solve(b2, r, c, d, u, k2+1);
  delete [] b2;
  if (ans == true) { copy(b2,b2+(m*n),b); return true; }

  k++;
  goto tryagain;
}

int main()
{
    int num = 0;
    while (true)
    {
      cin >> n >> m;
      if (n==0 && m==0) break;
      num++;

      vector<int> r(n);
      vector<int> c(m);
      vector<int> d(n+m-1);
      vector<int> u(n+m-1);

      int i,t;  // input constraints
      for(i=0; i < n; i++) { cin >> t; r[i] = t; }
      for(i=0; i < m; i++) { cin >> t; c[i] = t; }
      for(i=0; i < n+m-1; i++) { cin >> t; d[i] = t; }
      for(i=0; i < n+m-1; i++) { cin >> t; u[i] = t; }

      int *b = new int[n*m]; // board 
      for (i=0; i < n*m; i++ ) b[i] = UNKNOWN;

      solve(b, r, c, d, u, 0);

      cout << "Pizza box " << num << endl;
      printboxes(b);
      delete [] b;
    }
}

