#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using i128 = __int128;
const ll MOD = 998244353, G = 3;
template <ll M>
struct mint {
int x;
mint(ll v = 0) : x((v % M + M) % M) {}
mint operator-() const { return x ? M - x : 0; }
mint& operator+=(mint o) { return *this = *this + o; }
mint& operator-=(mint o) { return *this = *this - o; }
mint& operator*=(mint o) { x = (ll)x * o.x % M; return *this; }
mint& operator/=(mint o) { return *this *= o.inv(); }
mint operator+(mint o) const { return ((ll)x + o.x) % M; }
mint operator-(mint o) const { return ((ll)x - o.x + M) % M; }
mint operator*(mint o) const { return (ll)x * o.x % M; }
mint operator/(mint o) const { return *this * o.inv(); }
friend mint operator+(ll a, mint b) { return mint(a) + b; }
friend mint operator-(ll a, mint b) { return mint(a) - b; }
friend mint operator*(ll a, mint b) { return mint(a) * b; }
friend mint operator/(ll a, mint b) { return mint(a) / b; }
friend ostream& operator<<(ostream &o, mint v) { return o << v.x; }
friend istream& operator>>(istream &i, mint &v) { int t; i >> t; v = t; return i; }
bool operator==(mint o) const { return x == o.x; }
bool operator!=(mint o) const { return x != o.x; }
mint pow(ll exp) const {
mint r = 1, a = *this;
for (; exp; exp >>= 1, a *= a)
if (exp & 1) r *= a;
return r;
}
mint inv() const { return pow(M - 2); }
};
using Z = mint<MOD>;
const int N = 3e5 + 10;
int n, m, k, c;
ll v[N], w[N], sv[N], sw[N];
vector<array<int, 2>> g[N];
map<ll, ll> dis[N];
void dij()
{
priority_queue<array<ll, 3>, vector<array<ll, 3>>, greater<>> q;
//dis, node, p
q.push({0, 1, 1});
dis[1][1] = 0;
while(q.size())
{
auto [d, idx, p] = q.top();
q.pop();
if(dis[idx].count(p) && d != dis[idx][p]) continue;
// cout << d << " " << idx << " " << p << "\n";
for(int i = 1; i <= g[idx].size(); i ++)
{
auto [nxt, val] = g[idx][i - 1];
if(!dis[nxt].count(i))
{
if(i == p)
{
dis[nxt][p] = dis[idx][p] + val;
q.push({dis[nxt][p], nxt, p});
}
else if(i < p) //变小
{
dis[nxt][i] = dis[idx][p] + val + sw[p] - sw[i];
q.push({dis[nxt][i], nxt, i});
}
else//变大
{
dis[nxt][i] = dis[idx][p] + val + sv[i - 1] - sv[p - 1];
q.push({dis[nxt][i], nxt, i});
}
}
else
{
if(i == p)
{
if(dis[nxt][p] > dis[idx][p] + val)
{
dis[nxt][p] = dis[idx][p] + val;
q.push({dis[nxt][p], nxt, p});
}
}
else if(i < p) //变小
{
if(dis[nxt][i] > dis[idx][p] + val + sw[p] - sw[i])
{
dis[nxt][i] = dis[idx][p] + val + sw[p] - sw[i];
q.push({dis[nxt][i], nxt, i});
}
}
else//变大
{
if(dis[nxt][i] > dis[idx][p] + val + sv[i - 1] - sv[p - 1])
{
dis[nxt][i] = dis[idx][p] + val + sv[i - 1] - sv[p - 1];
q.push({dis[nxt][i], nxt, i});
}
}
}
}
}
}
void sol(int T)
{
cin >> c;
cin >> n >> m >> k;
for(int i = 1; i <= k - 1; i ++)
{
cin >> v[i];
sv[i] = sv[i - 1] + v[i];
}
for(int i = 2; i <= k; i ++)
{
cin >> w[i];
sw[i] = sw[i - 1] + w[i];
}
for(int i = 1; i <= n; i ++)
{
int d;
cin >> d;
for(int j = 1; j <= d; j ++)
{
int y, z;
cin >> y >> z;
g[i].push_back({y, z});
}
}
dij();
for(int i = 1; i <= n; i ++)
{
ll res = 1e18;
for(auto [p, v]:dis[i])
{
res = min(res, v);
}
if(res == 1e18) cout << -1 << " ";
else cout << res << " ";
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int t = 1;
// cin >> t;
for (int i = 1; i <= t; i++) sol(t);
}