Now Vasya is taking an exam in mathematics. In order to get a good mark, Vasya needs to guess the matrix that the teacher has constructed!

Vasya knows that the matrix consists of n rows and m columns. For each row, he knows the xor (bitwise excluding or) of the elements in this row. The sequence a1, a2, ..., an denotes the xor of elements in rows with indices 1, 2, ..., n, respectively. Similarly, for each column, he knows the xor of the elements in this column. The sequence b1, b2, ..., bm denotes the xor of elements in columns with indices 1, 2, ..., m, respectively.

Help Vasya! Find a matrix satisfying the given constraints or tell him that there is no suitable matrix.

Input

The first line contains two numbers n and m (2 ≤ n, m ≤ 100) — the dimensions of the matrix.

The second line contains n numbers a1, a2, ..., an (0 ≤ ai ≤ 109), where ai is the xor of all elements in row i.

The third line contains m numbers b1, b2, ..., bm (0 ≤ bi ≤ 109), where bi is the xor of all elements in column i.

Output

If there is no matrix satisfying the given constraints in the first line, output "NO".

Otherwise, on the first line output "YES", and then n rows of m numbers in each ci1, ci2, ... , cim (0 ≤ cij ≤ 2·109) — the description of the matrix.

If there are several suitable matrices, it is allowed to print any of them.

 

Examples

input

2 3
2 9
5 3 13

output

YES
3 4 5
6 7 8

input

3 3
1 7 6
2 15 12

output

NO
 

题意:

用输入的m,n分别代表一个矩阵的长和宽,构造一个矩形需要满足如下条件:

m行按位异或和分别等于第二行的每个数

n列按位运算和分别等于第三行的每个数

先打个比方假如m=3,n=4,则可构造一个这样的矩阵

3 1 1 1

2 0 0 0

2 0 0 0 

矩阵为1的部分代表要填数的地方,0则表示该处填0,因为这题有很多种构造方法,而因为0异或任何数值都不变,所以可以让中间的值全部为0,1处则填a1-a[n-1], 2处则填b[1]-b[m-1],把b[1]-b[m-1]的异或和赋值给flag,再让flag^=a[0],把a[0]-a[m-1]的异或和赋值给flag1,再判断flag^flag1是否等于b[0],等于则有该矩形存在,否则就不存在

 

#include<stdio.h>
#include<bits/stdc++.h>
#define ll long long int
using namespace std;
const int maxn = 1e3+5;
int num[maxn][maxn];
int a[maxn];
int b[maxn];
int ans,ans1;
int main()
{
    int n, m;

    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++)scanf("%d", &a[i]);
    for (int i = 0; i < m; i++)scanf("%d", &b[i]);
    for (int i = 1; i < m; i++)ans = ans ^ b[i];    //将第一行的填上的数(也就是b[1~n-1]值)再都异或起来得到ans
    ans = ans ^ a[0];                   //ans再异或a[0], 将得到的数填在num[0][0]
    for (int i = 1; i < n; i++)ans1 = ans1 ^ a[i];      //将第一列的填上的数(也就是a[1~m-1]值)再都异或起来得到ans1
    if ((ans^ans1) == b[0])printf("YES\n");     //判断num[0~n - 1][0]的所有值异或起来是否等于b[0],等于输出yes,不等于输出no
    else
    {
        printf("NO\n");
        return 0;
    }
    printf("%d ", ans);
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (i == 0 & j == 0)continue;
            else if (i == 0)
            {
                printf("%d ", b[j]);
            }
            else if (j == 0)
            {
                printf("%d ", a[i]);
            }
            else printf("0 ");
        }
        printf("\n");
    }

}