#include <cstdio>
#include <cstring>
const int MAXN = 1005;
int f[MAXN], g[MAXN], h[MAXN]; //f(x),g(x),h(x)
int numF, numG, numH; //f(x),g(x),h(x)的串长
int s[2 * MAXN];
int e[2 * MAXN];
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
memset(f, 0, sizeof(f));
memset(g, 0, sizeof(g));
memset(h, 0, sizeof(h));
memset(s, 0, sizeof(s));
scanf("%d", &numF);
for (int i = numF - 1; i >= 0; i--)
scanf("%d", &f[i]);
scanf("%d", &numG);
for (int i = numG - 1; i >= 0; i--)
scanf("%d", &g[i]);
scanf("%d", &numH);
for (int i = numH - 1; i >= 0; i--)
scanf("%d", &h[i]);
for (int i = 0; i < numF; i++) //计算f(x)*g(x)
{
for (int j = 0; j < numG; j++)
s[i + j] = ((f[i] && g[j]) + s[i + j]) % 2;
}
int d = numF + numG - 1; //f(x)*g(x)的位数
int dis = d - numH;
while (d >= numH)
{
memset(e, 0, sizeof(e));
for (int i = numH - 1; i >= 0; i--)
e[i + dis] = h[i];
for (int i = 0; i < d; i++)
s[i] = (s[i] + e[i]) % 2;
for (int i = d - 1; i >= 0; i--)
{
if (s[i] == 1)
{
d = i + 1;
break;
}
}
dis = d - numH;
}
for (int i = numH - 1; i >= 0; i--) //找到最高位
{
if (s[i] != 0)
{
d = i + 1;
break;
}
}
printf("%d", d);
for (int i = d - 1; i >= 0; i--)
printf(" %d", s[i]);
printf("\n");
}
return 0;
}