E: Jam

problem

There are N cities in a country, numbered 1, \ 2, \ ..., \ N. These cities are connected in both directions by M roads, and the i-th road allows you to travel between the cities u_i and v_i in time t_i. Also, any two cities can be reached by using several roads.

Bread is sold in each town, and the deliciousness of bread sold in town i is P_i.

In addition, there are K flavors of jam in this country, and in town i you can buy delicious J_i jams at taste c_i.

Homu-chan, who lives in Town 1, decided to go out to buy bread and jam one by one. Homu-chan travels through several cities, buys bread and jam, and returns to city 1. More precisely, go to city u to buy bread, select city v to buy jam, and return to city 1. At this time, u = v, u = 1, and v = 1 can be used.

The happiness of Homu-chan after shopping is "the total of the deliciousness of the bread and jam I bought"-"the time it took to move". For each of the K types of jam, calculate the maximum possible happiness when going to buy jam and bread of that taste.

Input format


NMK
P_1 P_2 ... P_N
c_1 c_2 ... c_N
J_1 J_2 ... J_N
u_1 v_1 t_1
u_2 v_2 t_2
::
u_M v_M t_M


Constraint

* 1 \ leq N \ leq 10 ^ 5
* 1 \ leq M \ leq 2 \ times 10 ^ 5
* 1 \ leq K \ leq N
* 1 \ leq P_i, J_i \ leq 10 ^ 9
* 1 \ leq c_i \ leq K
* 1 \ leq u_i, v_i \ leq N
* 1 \ leq t_i \ leq 10 ^ 9
* For all i \ (1 \ leq i \ leq K), there exists j \ (1 \ leq j \ leq N) such that c_j = i.
* Given graphs are concatenated graphs that do not include multiple edges or self-loops.
* All inputs are given as integers



Output format

Please output K line. On line i, print the maximum happiness when you go to buy bread and taste i jam.

Input example 1


4 4 3
3 6 1 6
1 1 2 3
6 1 5 5
1 2 1
2 3 1
1 3 1
1 4 1


Output example 1


Ten
8
9


* When buying taste 1 jam
* If you buy jam in city 1, move to city 2, buy bread, and come back to city 1, your happiness will be 6 + 6-2 = 10, which is optimal.
* When buying taste 2 jam
* If you move to City 2 to buy bread, move to City 3 to buy jam, and return to City 1, your happiness will be 6 + 5-3 = 8.
* When buying taste 3 jam
* If you go to City 4 and buy both bread and jam and come back to City 1, your happiness will be 6 + 5-2 = 9.



Input example 2


2 1 2
1 1
1 2
1 1
1 2 1000000000


Output example 2


2
-1999999998


* Homu-chan seems to be dissatisfied because the distance is too far compared to the deliciousness of bread and jam.



Input example 3


6 8 3
31 41 59 26 53 58
1 2 3 1 2 3
27 18 28 18 28 46
one two Three
2 3 7
2 4 8
3 6 9
3 5 3
4 5 3
1 5 15
4 6 7


Output example 3


66
61
68






Example

Input

4 4 3
3 6 1 6
1 1 2 3
6 1 5 5
1 2 1
2 3 1
1 3 1
1 4 1


Output

10
8
9
/*  -*- coding: utf-8 -*-
 *
 * 2956.cc: 
 */

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<deque>
#include<algorithm>
#include<numeric>
#include<utility>
#include<complex>
#include<functional>
 
using namespace std;

/* constant */

const int MAX_N = 100000;
const int MAX_K = MAX_N;
const long long LINF = 1LL << 62;

/* typedef */

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,int> pli;
typedef vector<pii> vpii;

/* global variables */

int ps[MAX_N], cs[MAX_N], js[MAX_N];
vpii nbrs[MAX_N];
ll dp0[MAX_N], dp1[MAX_N], maxhs[MAX_K];

/* subroutines */

void dijkstra(priority_queue<pli> &q, ll dp[]) {
  while (! q.empty()) {
    pli u = q.top(); q.pop();
    ll &ud = u.first;
    int &ui = u.second;
    if (ud != dp[ui]) continue;

    vpii &nbru = nbrs[ui];
    for (vpii::iterator vit = nbru.begin(); vit != nbru.end(); vit++) {
      int &vi = vit->first;
      ll vd = ud - vit->second;
      if (dp[vi] < vd) {
	dp[vi] = vd;
	q.push(pli(vd, vi));
      }
    }
  }
}

/* main */

int main() {
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);

  for (int i = 0; i < n; i++) scanf("%d", ps + i);
  for (int i = 0; i < n; i++) scanf("%d", cs + i), cs[i]--;
  for (int i = 0; i < n; i++) scanf("%d", js + i);

  for (int i = 0; i < m; i++) {
    int u, v, t;
    scanf("%d%d%d", &u, &v, &t);
    u--, v--;
    nbrs[u].push_back(pii(v, t));
    nbrs[v].push_back(pii(u, t));
  }

  fill(dp0, dp0 + n, -LINF);
  dp0[0] = 0;

  priority_queue<pli> q;
  q.push(pli(0, 0));
  dijkstra(q, dp0);

  fill(dp1, dp1 + n, -LINF);
  for (int i = 0; i < n; i++) {
    ll d = dp0[i] + ps[i];
    dp1[i] = d;
    q.push(pli(d, i));
  }
  dijkstra(q, dp1);

  fill(maxhs, maxhs + k, -LINF);

  for (int i = 0; i < n; i++) {
    ll h = dp1[i] + js[i] + dp0[i];
    if (maxhs[cs[i]] < h) maxhs[cs[i]] = h;
  }

  for (int i = 0; i < k; i++) printf("%lld\n", maxhs[i]);
  return 0;
}

