#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5;
int n, m, tot;
int tu, tv;
long long tw;
int frst[maxn + 5], nxt[(maxn << 2) + 5];
long long juli[maxn + 5], vis[maxn + 5];
struct zu {
  int hao;
  long long zhong;
  bool operator<(const zu &a) const { return zhong > a.zhong; }
} tmp;
priority_queue<zu> q;
struct node {
  int u, v;
  long long w;
} g[(maxn << 2) + 5];
void Dijkstra() {
  while (!q.empty()) {
    tmp = q.top();
    q.pop();
    if (!vis[tmp.hao]) {
      vis[tmp.hao] = 1;
      for (int i = frst[tmp.hao]; i != 0; i = nxt[i]) {
        if (tmp.zhong + g[i].w < juli[g[i].v]) {
          juli[g[i].v] = tmp.zhong + g[i].w;
          q.push((zu){g[i].v, juli[g[i].v]});
        }
      }
    }
  }
  return;
}
void add(int x, int y, long long z) {
  nxt[++tot] = frst[x], frst[x] = tot;
  g[tot].u = x, g[tot].v = y, g[tot].w = z;
  return;
}
int main() {
  scanf("%d%d", &n, &m);
  memset(juli, 0x3f, sizeof(juli));
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%lld", &tu, &tv, &tw);
    add(tu, tv, (tw << 1));
    add(tv, tu, (tw << 1));
  }
  for (int i = 1; i <= n; i++) {
    scanf("%lld", &tw);
    add(i, n + 1, tw);
    add(n + 1, i, tw);
  }
  tmp.hao = n + 1, tmp.zhong = 0;
  q.push(tmp);
  tmp = q.top();
  juli[n + 1] = 0;
  Dijkstra();
  for (int i = 1; i <= n; i++) printf("%lld ", juli[i]);
  puts("");
  return 0;
}
