#include<cstdio>
#include<queue>
using namespace std;
typedef __int64 ll;
const int MAXN = 550, MAXM = 105, iif = 0x3f3f3f3f;
const ll inf = ll(1)<<53;
struct _edge
{
int v, next, val;
ll cost;
_edge(){}
}e[5000010];
int head[MAXN], cnt, fa[MAXN], vis[MAXN], pos[MAXN];
ll dis[MAXN];
inline void add(int u, int v, int val, ll c)
{
e[cnt].v = v; e[cnt].val = val, e[cnt].cost = c; e[cnt].next = head[u];
head[u] = cnt++;
e[cnt].v = u; e[cnt].val = 0; e[cnt].cost = -c; e[cnt].next = head[v];
head[v] = cnt++;
}
bool spfa(int s, int t)
{
for(int i = 0; i<= t; ++i) fa[i]=-1,dis[i]=inf,vis[i]=0;
int bg = 0, ed = 0;
ll p;
queue<int> q;
q.push(s);
dis[s] = 0; vis[s] = 1;
while (!q.empty())
{
int u = q.front(); q.pop();
vis[u] = 0;
for (int i = head[u]; ~i; i=e[i].next)
{
int v = e[i].v;
if (e[i].val > 0 && dis[v] > (p = dis[u]+e[i].cost))
{
dis[v] = p;
fa[v] = u;
pos[v] = i;
if (!vis[v])
{
vis[v] = 1;
q.push(v);
}
}
}
}
return fa[t] != -1;
}
int tpm[MAXM], n, m, k;
void minCost_maxFlow(int s, int t)
{
int f = 0;
ll cost = 0;
while (spfa(s,t))
{
for (int i=t; i!=s; i=fa[i])
e[pos[i]].val--, e[pos[i]^1].val++;
cost += dis[t];
}
for (int i = 0; i< n; ++i)
f += e[tpm[i]].val;
if (f != n) {printf("-1\n"); return;}
printf("%I64d\n", cost+inf*n);
}
int st[MAXM][2], cc[MAXM][MAXM], dd[MAXM][MAXM], ee[MAXM][MAXM], ff[MAXM][MAXM];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int N, s, t;
while(scanf("%d%d%d", &n, &m, &k) && (n+m+k) != 0)
{
s = m+2*n, t = s+1;
cnt = 0;
memset(head, -1, sizeof head);
for (int i = 0; i< n; ++i)
scanf("%d%d", &st[i][0], &st[i][1]);
for (int i = 0; i< n; ++i)
for (int j = 0; j< m; ++j)
scanf("%d", &cc[i][j]);
for (int i = 0; i< n; ++i)
for (int j = 0; j< m; ++j)
scanf("%d", &dd[i][j]);
for (int i = 0; i< n; ++i)
for (int j = 0; j< n; ++j)
scanf("%d", &ee[i][j]);
for (int i = 0; i< n; ++i)
for (int j = 0; j< n; ++j)
scanf("%d", &ff[i][j]);
for (int i = 0, p; i< m; ++i)
{
add(s, i, 1, 0);
add(i, t, 1, 0);
for (int o = 0; o< n; ++o)
{
p = cc[o][i];
if (p < st[o][1])
{
if (p <= st[o][0]) add(i, o+m, 1, dd[o][i]);
else add(i, o+m, 1, dd[o][i]+k*(p - st[o][0]));
}
}
}
for (int i = 0, p; i< n; ++i)
{
add(m+n+i, t, 1, 0);
add(m+i, m+n+i, 1, -inf);
tpm[i] = cnt-1;
for (int j = 0; j< n; ++j)
{
if (i == j) continue;
p = st[i][1] + ee[i][j];
if (p < st[j][1])
{
if (p <= st[j][0]) add(m+n+i, m+j, 1, ff[i][j]);
else add(m+n+i, m+j, 1, ff[i][j]+k*(p-st[j][0]));
}
}
}
minCost_maxFlow(s, t);
}
return 0;
}