import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;
public class Main {
static Scanner sc = new Scanner(System.in);
static class Edge {
int t, w;
public int getT() {
return t;
}
public void setT(int t) {
this.t = t;
}
public int getW() {
return w;
}
public void setW(int w) {
this.w = w;
}
public Edge(int t, int w) {
super();
this.t = t;
this.w = w;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + t;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Edge other = (Edge) obj;
if (t != other.t)
return false;
return true;
}
}
static ArrayList<ArrayList<Edge>> edges = new ArrayList<>();
static ArrayList<Integer> safe = new ArrayList<Integer>();
static ArrayList<ArrayList<Integer>> safeMinDistance = new ArrayList<>();
static int n, m, k;
public static void main(String[] args) {
n = sc.nextInt();
m = sc.nextInt();
k = sc.nextInt();
mine = new Integer[n + 1];
vis = new boolean[n + 1];
edges.add(new ArrayList<Edge>());
for (int i = 0; i < n; i++) {
ArrayList<Edge> e = new ArrayList<Edge>();
e.add(new Edge(i + 1, 0));
edges.add(e);
int type = sc.nextInt();
if (type == 1) {
safe.add(i + 1);
}
}
for (int i = 0; i < m; i++) {
int u = sc.nextInt();
int v = sc.nextInt();
int w = sc.nextInt();
Edge e = new Edge(v, w);
int idx = edges.get(u).indexOf(e);
if (idx != -1) {
if (edges.get(u).get(idx).getW() > w) {
edges.get(u).get(idx).setW(w);
}
} else {
edges.get(u).add(e);
}
e = new Edge(u, w);
idx = edges.get(v).indexOf(e);
if (idx != -1) {
if (edges.get(v).get(idx).getW() > w) {
edges.get(v).get(idx).setW(w);
}
} else {
edges.get(v).add(e);
}
}
for (int i : safe) {
dij(i);
}
// for (ArrayList<Integer> lst : safeMinDistance) {
// lst.forEach(x -> System.out.print(x + " "));
// System.out.println();
// }
for (int i = 1; i <= n; i++) {
PriorityQueue<Integer> que = new PriorityQueue<Integer>((Integer o1, Integer o2) -> o2 - o1);
for (ArrayList<Integer> lst : safeMinDistance) {
if (lst.get(i) != Integer.MAX_VALUE) {
que.add(lst.get(i));
if (que.size() > k) {
que.remove();
}
}
}
int sum = 0;
for (Integer t : que) {
// System.out.print(t + " ");
sum += t;
}
// System.out.println();
System.out.println(sum);
}
}
static boolean[] vis;
static Integer[] mine;
static void dij(int p) {
Arrays.fill(mine, Integer.MAX_VALUE);
Arrays.fill(vis, false);
mine[p] = 0;
vis[p] = true;
ArrayList<Edge> es = edges.get(p);
int u = -1, min = Integer.MAX_VALUE;
for (Edge e : es) {
mine[e.t] = e.w;
}
for (int i = p + 1; i != p; i++) {
if (i == n + 1)
i = 1;
u = -1;
min = Integer.MAX_VALUE;
for (int j = 1; j <= n; j++) {
if (!vis[j] && mine[j] < min) {
min = mine[j];
u = j;
}
}
if (u == -1)
break;
vis[u] = true;
ArrayList<Edge> us = edges.get(u);
for (Edge e : us) {
if (!vis[e.t] && mine[e.t] > mine[u] + e.w) {
mine[e.t] = mine[u] + e.w;
}
}
}
ArrayList<Integer> lst = new ArrayList<Integer>();
lst.addAll(Arrays.asList(mine));
safeMinDistance.add(lst);
}
}