#include <iostream>
#include <vector>
using namespace std;
int n, m, b, c;
struct boil{
int mass = 0;
int number = 0;
vector<boil*> address;
vector<int> distance;
};
int empty = 0;
int near_tube = 0;
vector<int> visit;
//Комментарии с тестовым выводом оставлены специально. При понимании кода может помочь некая визуализация, достаточно лишь убрать "//".
int Min_way(boil* A, int i, int from){
//cout<<from+1<<"->"<<A[i].number+1<<"-->";//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if(A[i].mass>b){
near_tube = A[i].number;
return 0;
}
int min = 0;
bool t = 0;
for(int j = 0; j < A[i].distance.size(); j++){
bool t2 = true, t1 = true;
for(int u = 0; u < visit.size(); u++){
if(visit[u] == A[i].address[j] -> number) t2 = false;
if(visit[u] == A[i].address[min]->number) t1 = false;
}
if(A[i].address[j]->number == empty || A[i].address[j]->number == from) t2 = false;
if(A[i].address[min]->number == empty || A[i].address[min]->number == from) t1 = false;
if(A[i].distance[min] >= A[i].distance[j] && t2 || !t1 && t2){
min = j;
t = 1;
}
}
if(t == 0){
if(A[i].distance.size() == 1){
if(A[i].address[0]->mass > b){
near_tube = A[i].address[0]->number;
return A[i].distance[0];
}
else{
return -1;
}
}
else return -1;
}
else if(A[i].address[min]->mass == b){
visit.push_back(A[i].number);
bool t1 = true;
long long min2 = -1;
for(int k = 0; k < visit.size() && t1; k++){
if(visit[k] == A[i].address[min]->number) t1 = false;
}
if(A[i].address[min]->number == from) t1 = false;
if(t1) min2 = Min_way(A, A[i].address[min]->number, A[i].number);
if(min2 >= 0) min2 += A[i].distance[min];
// cout<<"("<<min2<<")";//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
int n1 = near_tube;
for(int j = 0; j < A[i].distance.size(); j++){
if(j != min && A[i].address[j]->mass >= b && A[i].address[j]->number != from){
visit.push_back(A[i].number);
long long a = 0;
bool t3 = true;
for(int k = 0; k < visit.size() && t3; k++){
if(visit[k] == A[i].address[j]->number)t3 = false;
}
if(A[i].address[j]->number == A[empty].number)t3 = false;
if(t1 && t3){
a = Min_way(A, A[i].address[j]->number, A[i].number);
}
else return -1;
if( a>= 0) a += A[i].distance[j];
// cout<<"("<<a<<")";//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if(a >= 0 && min2 >= a && A[near_tube].mass > b || min2 < 0){
min2 = a;
n1 = near_tube;
}
visit.clear();
}
}
near_tube = n1;
return min2;
}
else if(A[i].address[min]->mass < b){
return -1;
}
else{
near_tube = A[i].address[min]->number;
return A[i].distance[min];
}
}
int main() {
cin >> n >> m >> b >> c;
boil A[n];
for(int i = 0; i < n; i++){
int a;
cin>>a;
A[i].mass = a;
A[i].number = i;
if(A[empty].mass > a) empty = i;
}
int d, k, g;
while(cin >> d >> k >> g){
A[d-1].address.push_back(&A[k-1]);
A[k-1].address.push_back(&A[d-1]);
A[k-1].distance.push_back(g);
A[d-1].distance.push_back(g);
}
unsigned long long s = 0;
while(A[empty].mass < b){
/* for(int i=0; i<n;i++){//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
cout<<A[i].mass<<" ";
}cout<<endl;*/
unsigned long long a = Min_way(A, A[empty].number, A[empty].number);
if(A[near_tube].mass - b + A[empty].mass < b){
A[empty].mass += A[near_tube].mass - b;
s += a * (A[near_tube].mass - b);
A[near_tube].mass = b;
}
else{
int tmp = b - A[empty].mass;
A[near_tube].mass -= tmp;
A[empty].mass = b;
s += a * tmp;
}
//cout<<" : "<<a<<" "<<A[empty].mass<<" "<<near_tube<<endl<<endl;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
cout<<s * c;
return 0;
}