rt
#include<bits/stdc++.h>
#define INF 1e16
#define endl '\n'
#define PI acos(-1)
#define pb push_back
#define int long long
#define mem(x,v) memset(x,v,sizeof x)
using namespace std;
const int N = 1e4+5;
const int M = 1e5+5;
inline int read(){
register int x=0,f=1;register char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,m,t,cnt,ans;
int head[N],siz[N],dis[N],vis[N],fl[N],edg[N];
struct Edge{int to,next,w;}edge[M];
void add(int u,int v,int w){edge[++cnt]={v,head[u],w};head[u]=cnt;}
struct PriQueue{
int id,dis;
bool operator <(const PriQueue &x)const{
return x.dis<dis;
}
};
priority_queue <PriQueue> q;
void Dijkstra(){
mem(dis,0x3f),dis[1]=0,q.push({1,0});
while(!q.empty()){
int u=q.top().id;q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to,w=edge[i].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(!vis[v])q.push({v,dis[v]});
}
}
}
}
void dfs(int u){
for(int i=head[u];i;i=edge[i].next){
if(!edg[i])continue;
int v=edge[i].to;
dfs(v),siz[u]+=siz[v];
}
ans=max(ans,(dis[u]-t)*siz[u]);
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m>>t;
for(int i=1;i<=n;i++)cin>>siz[i];
for(int i=1,u,v,w;i<=m;i++)cin>>u>>v>>w,add(u,v,w),add(v,u,w);
Dijkstra();
for(int u=1;u<=n;u++){
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to,w=edge[i].w;
if(!fl[v]&&dis[u]+w==dis[v])edg[i]=1,fl[v]=1;
}
}
dfs(1),cout<<ans;
return 0;
}