#include<bits/stdc++.h>
using namespace std;
const long long N=1e6+10;
const long long M=1e6+10;
long long n,m,tot,s,head[N],d[N];
bool v[N];
struct edge {
long long to, w,nxt;
} e[M];
priority_queue< pair<long long ,long long> >q;
inline void add(long long u,long long v,long long w) {
e[++tot].to = v ;
e[tot].w = w ;
e[tot].nxt = head[u] ;
head[u] = tot ;
}
void dijkstra() {
for(long long i=1; i<=n; i++)
d[i]=0x3f3f3f3f;
d[s]=0;
q.push(make_pair(0,s));
while(q.size()) {
long long u=q.top().second;
q.pop();
if(v[u]) continue;
v[u] = 1 ;
for(long long i=head[u]; i!=0; i=e[i].nxt) {
long long v=e[i].to,w=e[i].w;
if(d[v] > d[u] + w) {
d[v] = d[u] + w;
q.push(make_pair(-d[v],v));
}
}
}
}
int main() {
cin>>n>>m;
s=n+1;
for(long long i=1; i<=m; i++) {
long long u,v,w;
cin>>u>>v>>w;
add(u,v,w*2);
add(v,u,w*2);
}
for(long long i=1;i<=n;i++)
{
long long w;
cin>>w;
add(s,i,w);
}
dijkstra();
for(long long i=1; i<=n; i++)
cout<<d[i]<<" ";
return 0;
}