#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <set>

using namespace std;

const int MaxM = 100005;


int d[MaxM];
int dist[1005][1005];

struct Elem1 {
    int idx;

    Elem1(int a = 0) {
        idx = a;
    }

    bool operator<(const Elem1& other) const {
        if (d[idx] != d[other.idx]) return d[idx] < d[other.idx];
        return idx < other.idx;
    }
};

struct Elem2 {
    int idx;
    int time;

    Elem2(int na = 0, int nb = 0) {
        idx = na;
        time = nb;
    }

    bool operator<(const Elem2& other) const {
        if (dist[idx][time] != dist[other.idx][other.time]) return dist[idx][time] < dist[other.idx][other.time];
        if (idx != other.idx) return idx < other.idx;
        return time < other.time;
    }
};

int n, m, p;
int a[MaxM];
int l[MaxM];
int r[MaxM];
set<Elem1> s;
set<Elem2> s2;

vector<int> pos[100005];

int Left[MaxM];
int Right[MaxM];
int last[MaxM];

int t1[1005][1005];
int t2[1005][1005];

int main() {
    freopen("autobusi.in", "r", stdin);
    freopen("autobusi.out", "w", stdout);
    for (int i = 0; i < n; ++i) pos[i].clear();
    scanf("%d%d%d", &m, &n, &p);
    for (int i = 0; i < m; ++i) {
        scanf("%d", &a[i]);
        pos[a[i]].push_back(i);
    }
    memset(last, -1, sizeof(last));
    for (int i = 0; i < m; ++i) {
        Left[i] = last[a[i] + 1];
        last[a[i]] = i;
    }
    memset(last, -1, sizeof(last));
    for (int i = m - 1; i >= 0; --i) {
        Right[i] = last[a[i] + 1];
        last[a[i]] = i;
    }
    for (int i = 0; i < p; ++i)
        scanf("%d", &l[i]);
    for (int i = 0; i < p; ++i)
        scanf("%d", &r[i]);
    if (p == 1) {
        s.clear();
        memset(d, -1, sizeof(d));
        for (int i = 0; i < m; ++i) {
            if (a[i] == 1) {
                d[i] = 0;
                s.insert(Elem1(i));
            }
        }
        int res = 0;
        while (!s.empty()) {
            Elem1 top = *(s.begin());
            s.erase(s.begin());
            int idx = top.idx;
            if (a[idx] == n) {
                res = d[idx];
                break;
            }
            int idx2;
            idx2 = Right[idx];
            if (idx2 != -1 && (d[idx2] == -1 || d[idx2] > d[idx] + (idx2 - idx) * r[0])) {
                if (d[idx2] != -1) s.erase(s.find(Elem1(idx2)));
                d[idx2] = d[idx] + (idx2 - idx) * r[0];
                s.insert(Elem1(idx2));
            }
            idx2 = Left[idx];
            if (idx2 != -1 && (d[idx2] == -1 || d[idx2] > d[idx] + (idx - idx2) * l[0])) {
                if (d[idx2] != -1) s.erase(s.find(Elem1(idx2)));
                d[idx2] = d[idx] + (idx - idx2) * l[0];
                s.insert(Elem1(idx2));
            }
        }
        printf("%d\n", res);
    } else if (m <= 1000 && p <= 1000) {
        for (int i = 0; i < p; ++i) {
            t1[0][i] = 0;
            t2[0][i] = 0;
        }
        for (int dist = 1; dist < m; ++dist)
            for (int j = 0; j < p; ++j) {
                int tmp1 = j + r[j];
                int tmp2 = j + l[j];
                if (tmp1 >= p) tmp1 -= p;
                if (tmp2 >= p) tmp2 -= p;
                t1[dist][j] = t1[dist - 1][tmp1] + r[j];
                t2[dist][j] = t2[dist - 1][tmp2] + l[j];
            }
        s2.clear();
        memset(dist, -1, sizeof(dist));
        for (int i = 0; i < m; ++i) {
            if (a[i] == 1) {
                dist[i][0] = 0;
                s2.insert(Elem2(i, 0));
            }
        }
        int res = 0;
        while (!s2.empty()) {
            Elem2 top = *(s2.begin());
            s2.erase(s2.begin());
            int idx = top.idx;
            int time = top.time;
            if (a[idx] == n) {
                res = dist[idx][time];
                break;
            }
            int idx2;
            int time2;
            idx2 = Right[idx];
            if (idx2 != -1) {
                int add = t1[idx2 - idx][time];
                time2 = (time + add) % p;
                if (dist[idx2][time2] == -1 || dist[idx2][time2] > dist[idx][time] + add) {
                    if (dist[idx2][time2] != -1) s2.erase(s2.find(Elem2(idx2, time2)));
                    dist[idx2][time2] = dist[idx][time] + add;
                    s2.insert(Elem2(idx2, time2));
                }
            }
            idx2 = Left[idx];
            if (idx2 != -1) {
                int add = t2[idx - idx2][time];
                time2 = (time + add) % p;
                if (dist[idx2][time2] == -1 || dist[idx2][time2] > dist[idx][time] + add) {
                    if (dist[idx2][time2] != -1) s2.erase(s2.find(Elem2(idx2, time2)));
                    dist[idx2][time2] = dist[idx][time] + add;
                    s2.insert(Elem2(idx2, time2));
                }
            }
            idx2 = idx;
            time2 = (time + 1) % p;
            if (dist[idx2][time2] == -1 || dist[idx2][time2] > dist[idx][time] + 1) {
                if (dist[idx2][time2] != -1) s2.erase(s2.find(Elem2(idx2, time2)));
                dist[idx2][time2] = dist[idx][time] + 1;
                s2.insert(Elem2(idx2, time2));
            }
        }
        printf("%d\n", res);
    } else {
        printf("Nemam vremena da otkucam ovo :D\n");
    }
    return 0;
}
