#include <cstdio>
#include <algorithm>
using namespace std;
#define Nmax 510
#define MOD 666013
int n, m, p, Vmax, poz, val, a, b, rez;
int A[Nmax][Nmax], B[Nmax][Nmax], Sa[Nmax], Sb[Nmax], SA[4 * Nmax], SB[4 * Nmax];
int S1[Nmax], S2[Nmax], S3[Nmax];
void citire () {
int i;
scanf ("%d %d %d", &n, &m, &p);
for (i = 1; i <= n; i++) {
scanf ("%d", &S1[i]);
if (S1[i] > Vmax) Vmax = S1[i];
}
for (i = 1; i <= m; i++) {
scanf ("%d", &S2[i]);
if (S2[i] > Vmax) Vmax = S2[i];
}
for (i = 1; i <= p; i++)
scanf ("%d", &S3[i]);
}
void update_A (int nod, int st, int dr) {
int MIJ = ((st + dr) >> 1), N1 = (nod << 1), N2 = ((nod << 1) + 1);
if (st == dr) {
SA[nod]+= val;
if (SA[nod] >= MOD) SA[nod]-= MOD;
return ;
}
if (poz <= MIJ) update_A (N1, st, MIJ);
else update_A (N2, MIJ + 1, dr);
SA[nod] = SA[N1] + SA[N2];
if (SA[nod] >= MOD) SA[nod]-= MOD;
}
void update_B (int nod, int st, int dr) {
int MIJ = ((st + dr) >> 1), N1 = (nod << 1), N2 = ((nod << 1) + 1);
if (st == dr) {
SB[nod]+= val;
if (SB[nod] >= MOD) SB[nod]-= MOD;
return ;
}
if (poz <= MIJ) update_B (N1, st, MIJ);
else update_B (N2, MIJ + 1, dr);
SB[nod] = SB[N1] + SB[N2];
if (SB[nod] >= MOD) SB[nod]-= MOD;
}
void query_A (int nod, int st, int dr) {
int MIJ = ((st + dr) >> 1), N1 = (nod << 1), N2 = ((nod << 1) + 1);
if (a <= st && dr <= b) {
rez+= SA[nod];
if (rez >= MOD) rez-= MOD;
return ;
}
if (a <= MIJ) query_A (N1, st, MIJ);
if (MIJ < b) query_A (N2, MIJ + 1, dr);
}
void query_B (int nod, int st, int dr) {
int MIJ = ((st + dr) >> 1), N1 = (nod << 1), N2 = ((nod << 1) + 1);
if (a <= st && dr <= b) {
rez+= SB[nod];
if (rez >= MOD) rez-= MOD;
return ;
}
if (a <= MIJ) query_B (N1, st, MIJ);
if (MIJ < b) query_B (N2, MIJ + 1, dr);
}
void dinamica () {
int i, j, k;
A[0][0] = 1;
Sa[0] = 1;
int N = 4 * Vmax * (sizeof (int)) + 8, NN = n * (sizeof (int)) + 8;
for (i = 1; i <= n; i++) {
memset (SA, 0, N);
poz = 0; val = 1;
update_A (1, 0, Vmax);
for (j = 1; j <= m; j++) {
if (S1[i] == S2[j]) {
rez = 0; a = 0; b = S2[j];
query_A (1, 0 ,Vmax);
A[i][j]+= rez;
if (A[i][j] >= MOD) A[i][j]-= MOD;
}
if (Sa[j]) {
poz = S2[j]; val = Sa[j];
update_A (1, 0, Vmax);
}
}
for (j = 1; j <= m; j++) {
Sa[j] = Sa[j] + A[i][j];
if (Sa[j] >= MOD) Sa[j]-= MOD;
}
}
memset (Sa, 0, NN);
memset (SA, 0, N);
Sa[0] = 1;
for (k = 1; k <= p; k++) {
for (i = 1; i <= n; i++) {
memset (SA, 0, N);
memset (SB, 0, N);
poz = 0; val = Sa[0];
if (val) update_A (1, 0, Vmax);
for (j = 1; j <= m; j++) {
if (S1[i] == S2[j]) {
if (S1[i] == S3[k]) {
rez = 0; a = 0; b = S2[j];
query_A (1, 0 ,Vmax);
B[i][j]+= rez;
if (B[i][j] >= MOD) B[i][j]-= MOD;
}
else {
rez = 0; a = 0; b = S2[j];
query_B (1, 0 ,Vmax);
B[i][j]+= rez;
if (B[i][j] >= MOD) B[i][j]-= MOD;
}
}
poz = S2[j]; val = Sa[j];
if (val) update_A (1, 0, Vmax);
poz = S2[j]; val = Sb[j];
if (val) update_B (1, 0, Vmax);
}
for (j = 1; j <= m; j++) {
Sb[j] = Sb[j] + B[i][j];
Sa[j] = Sa[j] + A[i][j];
if (Sa[j] >= MOD) Sa[j]-= MOD;
if (Sb[j] >= MOD) Sb[j]-= MOD;
}
}
memcpy (Sa, Sb, NN);
memset (Sb, 0, NN);
memset (Sa, 0, NN);
for (i = 0; i <= n; i++) {
memcpy (A[i], B[i], NN);
memset (B[i], 0, NN);
}
}
int sol = 0;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++) {
sol+= A[i][j];
if (sol >= MOD) sol-= MOD;
}
printf ("%d", sol);
}
int main () {
freopen ("pedefe.in", "r", stdin);
freopen ("pedefe.out", "w", stdout);
citire ();
dinamica ();
return 0;
}