#include<bits/stdc++.h>
using namespace std;
const long long maxn=100005;
long long n,m,t,ans,a[maxn],s[maxn],d[maxn],pre[maxn];
bool b[maxn],f[maxn];
struct uu
{
long long x,y;
};
bool operator<(uu a,uu b)
{
return a.y>b.y;
}
priority_queue<uu>q;
vector<long long>u[maxn];
vector<uu>v[maxn];
void ss(long long x,long long fa)
{
s[x]=a[x];
for(auto y:u[x])
{
if(y==fa)continue;
ss(y,x);
s[x]+=s[y];
}
ans=max(ans,(d[x]-t)*s[x]);
}
int main()
{
cin>>n>>m>>t;
for(long long i=1;i<=n;i++)
{
cin>>a[i];
}
for(long long i=1;i<=m;i++)
{
long long x,y,z;
cin>>x>>y>>z;
v[x].push_back({y,z});
v[y].push_back({x,z});
}
memset(d,0x3f,sizeof(d));
d[1]=0;
q.push({1,0});
while(!q.empty())
{
while(!q.empty()&&b[q.top().x])q.pop();
b[q.top().x]=true;
long long x=q.top().x;
long long y=q.top().y;
q.pop();
for(auto y:v[x])
{
if(d[y.x]>d[x]+y.y||(d[y.x]==d[x]+y.y&&x<pre[y.x]))
{
pre[y.x]=x;
d[y.x]=d[x]+y.y;
if(!f[y.x])
{
f[y.x]=true;
q.push({y.x,d[y.x]});
}
}
}
}
for(long long i=2;i<=n;i++)
{
u[pre[i]].push_back(i);
u[i].push_back(pre[i]);
}
ss(1,0);
cout<<ans<<endl;
return 0;
}