#include<iostream>
#include<fstream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
long long inline read(){
char a;long long now=0;
a=getchar();
while (a<'0'||a>'9')a=getchar();
while ('0'<=a&&a<='9')now=(now<<1)+(now<<3)+a-'0',a=getchar();
return now;
}
struct st{
long long dis,to,next;
}edge[400010];
struct st2{
long long id,x;
}b[200010];
long long cnt,f[200010],hd[200010],x,y,z,n,m,now,minn,s;
bool vis[200010],r[200010];
struct tmp
{
bool operator() (long long a,long long b)
{
return f[a] < f[b];
}
};
void add_edge(long long u,long long v,long long dis){
edge[++cnt].next=hd[u];
edge[cnt].to=v;
edge[cnt].dis=dis;
hd[u]=cnt;return ;
}
void dij(){
priority_queue <tmp,vector<long long>,less<long long> > q;
for (int i=1;i<=n;i++)q.push(i),vis[i]=true;
while (!q.empty()){
now=q.top();q.pop();
vis[now]=0;
r[now]=true;
for (long long i=hd[now];i;i=edge[i].next){
if (f[now]+edge[i].dis<f[edge[i].to]){
f[edge[i].to]=f[now]+edge[i].dis;
// printf("!!%d %d %d %d %d\n",now,edge[i].to,edge[i].dis,f[now],f[edge[i].to]);
if (!vis[edge[i].to])q.push(edge[i].to),vis[edge[i].to]=true;
}
}
}
}
int main(){
n=read();m=read();
minn=1e9;
for (int i=1;i<=m;i++){
x=read();y=read();z=read();
if (z*2>=1000000000000ll)continue;
add_edge(x,y,z*2);
add_edge(y,x,z*2);
}
for (int i=1;i<=n;i++){
scanf("%lld",&f[i]);
}
dij();
for (int i=1;i<=n;i++){
printf("%lld ",f[i]);
}
return 0;
}