#include <bits/stdc++.h>
using namespace std;
int N;
int M;
struct Edge {
  int u;
  int v;
  long long w;
  Edge(int u, int v, long long w) : u(u), v(v), w(w) {}
};
vector<Edge> adj[1 << 18];
long long c[1 << 18];
long long ans[1 << 18];
int ri[1 << 18];
int main() {
  scanf("%d %d", &N, &M);
  for (int i = 0; i < M; i++) {
    int u;
    int v;
    long long w;
    scanf("%d %d %lld", &u, &v, &w);
    u--;
    v--;
    adj[u].emplace_back(u, v, w);
    adj[v].emplace_back(v, u, w);
  }
  for (int i = 0; i < N; i++) {
    scanf("%lld", &c[i]);
    ans[i] = c[i];
  }
  auto cmp = [](int a, int b) {
    if (ans[a] != ans[b]) return ans[a] < ans[b];
    return a < b;
  };
  set<int, decltype(cmp)> s(cmp);
  for (int i = 0; i < N; i++) {
    s.insert(i);
  }
  while (!s.empty()) {
    int u = *s.begin();
    s.erase(s.begin());
    for (Edge& e : adj[u]) {
      if (ans[u] + (e.w << 1) < ans[e.v]) {
        assert(s.find(e.v) != s.end());
        s.erase(s.find(e.v));
        ans[e.v] = ans[u] + (e.w << 1);
        s.insert(e.v);
      }
    }
  }
  for (int i = 0; i < N; i++) {
    printf("%lld ", ans[i]);
  }
}
