#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
#include<queue>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=2*1e5;
const ll inf=1e12;
struct edge{
int to;
ll w;
int next;
}e[4*maxn+5];
struct node{
int to;
ll w;
bool operator <(node a)const{
return w>a.w;
}
};
int head[maxn+10];
int tot=0;
ll d[maxn+10];
ll a[maxn+10];
bool vis[maxn+10];
int n,m;
void add(int x,int y,ll w)
{
e[tot].to=y,e[tot].next=head[x],e[tot].w=w,head[x]=tot++;
e[tot].to=x,e[tot].next=head[y],e[tot].w=w,head[y]=tot++;
}
void init()
{
scanf("%d%d",&n,&m);
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
d[0]=0;
a[0]=0;
int x,y;
ll w;
for(int i=1;i<=m;i++)
{
scanf("%d%d%lld",&x,&y,&w);
add(x,y,2*w);
}
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)
{
d[i]=inf;
add(0,i,a[i]);
}
}
void spfa()
{
priority_queue<node>q;
q.push((node){0,0});
while(!q.empty())
{
node x=q.top();
q.pop();
int now=x.to;
if(vis[now]) continue;
vis[now]=1;
for(int i=head[now];i!=-1;i=e[i].next)
{
ll w=e[i].w;
int now2=e[i].to;
if(d[now]+w<d[now2])
{
d[now2]=d[now]+w;
q.push((node){now2,d[now2]});
}
}
}
}
int main()
{
// freopen("in.txt","r",stdin);
init();
spfa();
for(int i=1;i<=n;i++)
printf("%lld ",d[i]);
return 0;
}