#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<<"-->";//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/*for(int l=0; l<visit.size(); l++){
cout<<visit[l]<<" ";
}cout<<endl;*/
if(A[i].mass>b){
/*int need=0;
for(int j=0; j<A[i].distance.size() && need==0; j++){
if(A[from].address[j]->number==i)need=j;
}//cout<<A[from].distance[need];
*/
near_tube=A[i].number;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
return 0;//A[from].distance[need];
}
int min=0;
near_tube=0;//Возможно, надо убрать. Может зануляться при рекурсии ненужный раз
bool t=0,t2=1;//t=1;->Ко второму !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//for(auto j: A[i].distance){
for(int j=0; j< A[i].distance.size(); j++){
t2=true;//cout<<"/"<<A[i].address[j]->number+1<<"/";
for(int u=0; u<visit.size();u++){
if(visit[u]==A[i].address[j]->number){
t2=false;
}
}
// for(int u=0; u<A[empty].address.size()&& A[i].number!=A[empty].number; u++)
// if(A[i].address[j]->number==A[empty].address[u]->number)t2=false;
if(A[i].address[j]->number==A[empty].number)t2=false;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if(A[i].distance[min]>=A[i].distance[j] && A[i].address[j]->number!=from && t2){//Если в котёл, где одна труба == b?//= нужно. Без него нет t, видимо
min=j;
t=1;//Ко второму. Подумать ещё!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}//<<" ";//cout<<min<<" ";
}
//cout<<min<<"`";
/*
visit.push_back(A[i].number);
for(int k=0; k<visit.size() && t; k++){
if(visit[k]==A[i].address[min]->number){
t=false;
}
}
*/
if(t==0 && 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 if(t==0){
return -1;
}
else if(A[i].address[min]->mass==b){
//visit.push_back(A[i].number);//(A[i].address[j]->number)
// for(int l=0; l<visit.size(); l++){
// cout<<visit[l]<<" ";
// }cout<<endl;
long long min2;
bool t1=true;
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){
t1=true;
for(int k=0; k<visit.size() && t1; k++){
if(visit[k]!=A[i].address[min]->number && A[i].address[k]->number!=from){
t1=false;
min=k;
}
}
}
if(!t1)return -1;
/*else{
min2=Min_way(A,A[i].address[min]->number,A[i].number)+A[i].distance[min];
}*/
min2=Min_way(A,A[i].address[min]->number,A[i].number);
if(min2>=0)min2+=A[i].distance[min];//Да-да, одно и тоже, подумать зачем.
//min2=1000;//ДАааааа, оно тут так просто работает! Но неееет, нужно же как-то сделать первый элемент!
int n=near_tube;//n- потому что near!
int n1=near_tube;//n1- потому что n работает частично, но всё ещё near!
vector<int> v_of_n_tubes;//vector of near tubes
// cout<<"("<<min2<<","<<t1<<")"<<"m"<<"b ";//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// int min2=Min_way(A,A[i].address[min]->number,A[i].number)+A[i].distance[min];
//v_of_n_tubes.push_back(near_tube);
//int vont=-1;//value of near tubes
for(int j=0; j<A[i].distance.size(); j++){
if(j!=min && A[i].address[j]->mass>=b){
if(A[i].address[j]->mass>=b && A[i].address[j]->number!=from){
visit.push_back(A[i].number);//Второй раз!!!!!!!!!!!!!!!!!!!!!!!!Во втором варианте, в начале функции
long long a=0;
t1=true;bool t3=true;
for(int k=0; k<visit.size() && t1; k++){
if(visit[k]==A[i].address[j]->number)t3=false;
}
// for(int u=0; u<A[empty].address.size() && A[i].number!=A[empty].number; u++)
// if(A[i].address[j]->number==A[empty].address[u]->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(min!=j)v_of_n_tubes.push_back(near_tube);//?????????????????????????????????????????????????????????????
visit.push_back(A[i].address[j]->number);//По рекурсии сюда вряд ли зайдёт, смысл?//Возможно, лишнее
// cout<<a<<"->";
//a=Min_way(A,A[i].address[j]->number,A[i].number);//==0? 0 :
if(a>=0)a+=(A[i].distance[j]);//cout<<a<<" "<<A[i].distance[j]<<" "<<A[i].number+1<<" ";//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if(a>=0 && min2>=a && A[near_tube].mass>b || (n==-1? false : A[n].mass==b) ||min2<0 /*A[i].address[j]->mass<=b||*/){//По сути, == b
//if(A[i].address[j]->mass!=b)
min2=a;
n=-1;//cout<<A[near_tube].mass;//cout<<" e ";
// if(min!=j)vont=j;//Если минимум-минимум.
//vont++;
//v_of_n_tubes.push_back(near_tube);
n1=near_tube;
}//cout<<"m:"<<min2<<" ";
// cout<<"("<<a<<","<<t1<<")"<<"b ";//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
visit.clear();
}
}
//else v_of_n_tubes.push_back(near_tube);//???????????????????????????????????????????????????????????????????????
}//for(int i=0;i<v_of_n_tubes.size();i++)//cout<<v_of_n_tubes[i]<<" - "<<vont<<" ";
//visit.clear();
near_tube=n1;//(vont>=0? v_of_n_tubes[vont] : n);//cout<<endl;
return min2;
/*
else{
visit.clear();
return -1;
}*/
}
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() {//cout<<3;
cin>>n;//cin.get();
cin>>m;//cin.get();
cin>>b;//cin.get();
cin>>c;//cin.get();
boil A[n];
// cin.ignore(32767, '\n' || ' ');
for(int i=0; i<n; i++){//cout<<5;
int a;//cin.ignore(32767, '\n' || ' ');
cin>>a;//cin.clear();//cout<<5;
//scanf("%c", a);
A[i].mass=a;
A[i].number=i;
if(A[empty].mass>a)empty=i;
}
int d;
//for(int i=0; i<m; i++){//cout<<9;//m+1, там тест странный.
while(cin>>d){
int a,g;
cin>>a>>g;
// cin>>a;//cin.get();
// cin>>d;//cin.get();
// cin>>g;//cout<<5;
// cout<<a<<" "<<d<<" "<<g<<endl;
A[d-1].address.push_back(&A[a-1]);//cout<<5;
A[a-1].address.push_back(&A[d-1]);
A[a-1].distance.push_back(g);
A[d-1].distance.push_back(g);
//cout<<8;
}
//int i=0;
unsigned long long s=0;//cout<<(A[0].address[0])->mass;
while(A[empty].mass<b){
//boil* tmp=A[empty].A[empty].address[Min_way(A,empty)]->mass;
unsigned long long a=Min_way(A,A[empty].number, -1);//cout<<a<<" ";a=Min_way(A, A[empty].number, -1);cout<<a<<" ";break;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if(A[near_tube].mass-b+A[empty].mass<b){//< ??
A[empty].mass+=A[near_tube].mass-b;//number
s+=a*(A[near_tube].mass-b);
A[near_tube].mass=b;
//'d'//distance
}
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;
//cout<<s<<" ";
}//cout<<A[empty].distance[Min_way(A,empty)]<<" ";
//for(int i=0; i<3;i++)cout<<A[3].address[i]->number+1<<" ";cout<<endl;
/*
for(int i=0; i<8; i++){
cout<<A[i].mass<<" ";
}cout<<endl;
cout<<" "<<Min_way(A,3,-1)<<" "<<endl;
//cout<<Min_way(A,6,1)<<" "<<A[6].mass<<endl;
*/
//cout<<A[3].address[1]->number+1;
/*
for(int i=0; i<4;i++){
//boil* tmp=A[empty].A[empty].address[Min_way(A,empty)]->mass;
int a=Min_way(A,A[empty].number, -1);
if(A[near_tube].mass-b+A[empty].mass<=b){//< ?
A[empty].mass+=((A[near_tube].mass)-b);//number
s+=a*((A[near_tube].mass)-b);
(A[near_tube].mass)=b;
//'d'//distance
}
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;
}
*/
cout<<s*c;
// cout<<" "<<Min_way(A,empty)<<" "<< A[empty].distance[Min_way(A,empty)];
return 0;
}
/* int tmp=((A[empty].address[Min_way(A,empty)])->mass)-b;
A[empty].address[Min_way(A,empty)]->mass-=b;
A[empty].mass+=tmp;//number
*/
//cin.putback(' ');cin.putback('4');cin.putback('\n');
/*bool t=true;
do{
g=cin.peek()-48;cout<<" "<<g;cout<<3<<" ";
if(g!=-16 && i==m-1){//==
t=false;
cin.ignore(2,'\n');cout<<5;
cin.clear();
}
if(!t){
string str;
scanf("%s", str);
//cin.putback(EOF);
cin.clear();
}
if(t){
char a;
cin.get(a);
}
}while(g==-16 && t);*/
// cout<<a<<" "<<d<<" "<<g<<"\n";
/* int a,d,g;
cin>>a;
cin>>d;
cin>>g;
cout<<a<<" "<<d<<" "<<g<<"\n";
A[d-1].address.push_back(&A[a-1]);//cout<<5;
A[a-1].address.push_back(&A[d-1]);
A[a-1].distance.push_back(g);
A[d-1].distance.push_back(g);*/
//int* N=&n;
/* scanf("%d", &n);//cout<<n;//int* M=&m;
scanf("%d", &m);//cout<<m;
scanf("%d", &b);
scanf("%d", &c);
cout<<n<<m<<b<<c;
boil A[n];
int empty=0;
for(int i=0; i<n; i++){
int a;
scanf("%d", a);
A[i].mass=a;
A[i].number=i;
if(A[empty].mass>a)empty=i;
}
for(int i=0; i<m; i++){//cout<<9;
int a,d,g;
scanf("%d", a);
scanf("%d", d);
scanf("%d", g);
A[d-1].address.push_back(&A[a-1]);//cout<<5;
A[a-1].address.push_back(&A[d-1]);
A[a-1].distance.push_back(g);
A[d-1].distance.push_back(g);
}*/
/* cin>>n;
cin>>m;
cin>>b;
cin>>c;
for(int i=0; i<n; i++){
int a;
cin>>a;
}
for(int i=0; i<m; i++){//cout<<9;
int a,d,g;
cin>>a;
cin>>d;
cin>>g;
}cout<<4;
boil A[n];
int empty=0;
*/
/* int b=Min_way(A,A[i].address[0]->number,A[i].number);
int index=-1;//Тоже ?
for(int j=0; j<A[i].distance.size(); j++){
if(A[i].number!=from){
int a=Min_way(A,A[i].address[j]->number,A[i].number);//==0? 0 :;
if(a>0 && (b>0? a<b : 10000)){//Да-да, 10000 -такое тут
b=a;
index=j;
}
}
}min2=b+A[i].distance[index];*/