#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;
}