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
#include<bits/stdc++.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define HUGE_NUM 99999999999999999
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;



#define SIZE 100005

struct Edge{
	Edge(int arg_to,ll arg_cost){
		to = arg_to;
		cost = arg_cost;
	}
	int to;
	ll cost;
};

struct State{
	State(int arg_node_id,ll arg_sum_cost){
		node_id = arg_node_id;
		sum_cost = arg_sum_cost;
	}
	bool operator<(const struct State &arg) const{
		return sum_cost > arg.sum_cost; //総コストの昇順(PQ)
	}

	int node_id;
	ll sum_cost;
};

int V,E,K;
ll P[SIZE],c[SIZE],J[SIZE],ans[SIZE];
ll min_cost[2*SIZE];
vector<Edge> G[2*SIZE];


int main(){

	scanf("%d %d %d",&V,&E,&K);

	for(int i = 0; i < V; i++){

		scanf("%lld",&P[i]);
	}

	for(int i = 0; i < V; i++){

		scanf("%lld",&c[i]);
		c[i]--;
	}

	for(int i = 0; i < V; i++){

		scanf("%lld",&J[i]);
	}

	int from,to;
	ll cost;

	for(int loop = 0; loop < E; loop++){

		scanf("%d %d %lld",&from,&to,&cost);
		from--;
		to--;

		G[from].push_back(Edge(to,cost));
		G[to].push_back(Edge(from,cost));

		G[V+from].push_back(Edge(V+to,cost));
		G[V+to].push_back(Edge(V+from,cost));
	}

	for(int from = 0; from < V; from++){

		int to = V+from;
		G[from].push_back(Edge(to,-P[from]+BIG_NUM));
	}


	min_cost[0] = 0;
	for(int i = 1; i < 2*V; i++){

		min_cost[i] = HUGE_NUM;
	}

	priority_queue<State> Q;
	Q.push(State(0,0));

	while(!Q.empty()){

		if(Q.top().sum_cost > min_cost[Q.top().node_id]){

			Q.pop();

		}else{

			for(int i = 0; i < G[Q.top().node_id].size(); i++){

				int next_node = G[Q.top().node_id][i].to;
				ll next_cost = Q.top().sum_cost+G[Q.top().node_id][i].cost;

				if(min_cost[next_node] > next_cost){

					min_cost[next_node] = next_cost;
					Q.push(State(next_node,next_cost));
				}

			}

			Q.pop();
		}
	}

	for(int i = 0; i < K; i++){

		ans[i] = HUGE_NUM;
	}

	for(int i = 0; i < V; i++){

		ans[c[i]] = min(ans[c[i]],min_cost[i]+min_cost[V+i]-BIG_NUM-J[i]);
	}

	for(int i = 0; i < K; i++){

		printf("%lld\n",-ans[i]);
	}

	return 0;
}

