#include <stdlib.h>
#include <stdio.h>
#include <algorithm>

using namespace std;

const int maxL = 100010;
const int maxLog = 20;
const long long besk = (long long)1 << 62;

typedef struct { int pozicija, vrednost; } Polje;
bool comparePolja(Polje const& p1, Polje const& p2) {
    return (p1.vrednost < p2.vrednost);
}


int n, m, p;
int a[maxL], pret[maxL], sled[maxL];
long long t[maxL];
long long l[maxL][maxLog], d[maxL][maxLog];

Polje polja[maxL];
void sortirajPolja() {
    for (int i = 0; i < m; i++) {
        polja[i].pozicija = i;
        polja[i].vrednost = a[i];    
    }     
    sort(polja, polja + m, comparePolja);
}

void ucitajPodatke() {
    freopen("autobusi.in", "r", stdin);
    scanf("%d%d%d", &m, &n, &p);
    for (int i = 0; i < m; i++) 
        scanf("%d", &(a[i]));
    for (int i = 0; i < p; i++) 
        scanf("%d", &(l[i][0]));
    for (int i = 0; i < p; i++) 
        scanf("%d", &(d[i][0]));
}

void preracunaj(long long x[][maxLog]) {
    long long tmin = x[0][0] + 1;
    for (int k = 0; k < 2; k++)
         for (int i = p - 1; i >= 0; i--) {
             if (tmin < x[i][0]) 
                 x[i][0] = tmin;
             else tmin = x[i][0];
             tmin++;
         }
    for (int j = 1; j < maxLog; j++)
        for (int i = 0; i < p; i++)
            x[i][j] = x[i][j - 1] + x[(i + x[i][j - 1]) % p][j - 1];
}

void nadjiSusedne() {
    int poslednji[maxL];
    for (int i = 0; i <= n + 1; i++) 
        poslednji[i] = -1;
    for (int i = 0; i < m; i++) {
        pret[i] = poslednji[a[i] + 1];
        poslednji[a[i]] = i;    
    }     
    for (int i = 0; i <= n + 1; i++) 
        poslednji[i] = -1;
    for (int i = m - 1; i >= 0; i--) {
        sled[i] = poslednji[a[i] + 1];
        poslednji[a[i]] = i;    
    }     
}

long long fmin(long long a, long long b) {
    return (a < b) ? a : b;   
}

long long potrebno(long long x[][maxLog], long long startT, long long udaljenost) {
    int tmp = 0; long long ret = 0; startT %= p;
    while (udaljenost > 0) {
        if ((udaljenost & 1) != 0) {
            ret += x[startT][tmp];
            startT = (startT + x[startT][tmp]) % p;                
        }
        tmp++;
        udaljenost >>= 1;     
    }
    return ret;    
}

void resi() {
    preracunaj(l);
    preracunaj(d);    
    nadjiSusedne();
    
    sortirajPolja();
    for (int i = 0; i < m; i++) 
        t[i] = (a[i] == 1) ? 0 : besk;
    for (int j = 0; j < m; j++) {
        int i = polja[j].pozicija;
        if (pret[i] >= 0)
           t[pret[i]] = fmin(t[pret[i]], t[i] + potrebno(l, t[i], i - pret[i]));
        if (sled[i] >= 0)
           t[sled[i]] = fmin(t[sled[i]], t[i] + potrebno(d, t[i], sled[i] - i));
    }
}

void sacuvajResenje() {
    freopen("autobusi.out", "w", stdout);
    long long res = -1;
    for (int i = 0; i < m; i++)
        if (a[i] == n && (res == -1 || res > t[i]))
            res = t[i];
    printf("%lld\n", res);
}

int main() {
    ucitajPodatke();
    resi();
    sacuvajResenje();
    return 0;
}	 
