RT,从魔法森林过来的。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
long long read(){
long long x=0,f=1;char ch=getchar();
while(!isdigit(ch))
{if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void write(long long x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
const int N=5e4+10,M=5e4+10;
int n,m,sz;
ll ans=-1;
struct asdf{
int x,y;
ll a,b;
}c[M];
bool cmp(asdf p,asdf q){
return p.a<q.a;
}
multiset<ll>s;
#define pl a[p].ch[0]
#define pr a[p].ch[1]
struct LCT{
struct Tree{
int ch[2],fa;
ll mx,val,id,vid,rev;
}a[M*2];
bool isroot(int p){
return a[a[p].fa].ch[0]!=p&&a[a[p].fa].ch[1]!=p;
}
void pushup(int p){
a[p].mx=a[p].val;a[p].id=a[p].vid;
if(a[pl].mx>a[p].mx)
a[p].mx=a[pl].mx,a[p].id=a[pl].id;
if(a[pr].mx>a[p].mx)
a[p].mx=a[pr].mx,a[p].id=a[pr].id;
}
void pushrev(int p){
swap(pl,pr);a[p].rev^=1;
}
void pushdown(int p){
if(a[p].rev){
if(pl)pushrev(pl);
if(pr)pushrev(pr);
a[p].rev=0;
}
}
void update(int p){
if(!isroot(p))update(a[p].fa);
pushdown(p);
}
int get(int p){
return a[a[p].fa].ch[1]==p;
}
void rotate(int p){
int fp=a[p].fa,ffp=a[fp].fa;
int ty=get(p);
if(!isroot(fp))a[ffp].ch[get(fp)]=p;
a[p].fa=ffp;a[fp].ch[ty]=a[p].ch[ty^1];
if(a[p].ch[ty^1])a[a[p].ch[ty^1]].fa=fp;
a[fp].fa=p;a[p].ch[ty^1]=fp;
pushup(fp);pushup(p);
}
void splay(int p){
update(p);
for(int fp;!isroot(p);rotate(p)){
fp=a[p].fa;
if(!isroot(fp))
rotate(get(p)^get(fp)?p:fp);
}
}
void access(int p){
for(int q=0;p;p=a[q=p].fa)
splay(p),pr=q,pushup(p);
}
void makeroot(int p){
access(p);splay(p);pushrev(p);
}
int findroot(int p){
access(p);splay(p);
while(pl)pushdown(p),p=pl;
splay(p);return p;
}
void split(int p,int q){
makeroot(p);access(q);splay(q);
}
void link(int p,int q){
makeroot(p);
if(p!=findroot(q))a[p].fa=q;
}
void cut(int p,int q){
makeroot(p);
if(p==findroot(q)&&a[q].fa==p&&!a[q].ch[0]){
a[q].fa=pr=0;
pushup(p);
}
}
void change(int p,ll val,int vid){
splay(p);a[p].val=val;a[p].vid=vid;pushup(p);
}
void add(int p,asdf t){
change(p,t.b,p-n);
if(findroot(t.x)!=findroot(t.y)){
link(t.x,p);link(t.y,p);
s.insert(t.b);
sz++;
}
else{
split(t.x,t.y);
if(a[t.y].mx>t.b){
int u=a[t.y].id;
int x=c[u].x,y=c[u].y;
s.erase(a[t.y].mx);
cut(x,u+n);cut(u+n,y);
s.insert(t.b);
link(t.x,p);link(t.y,p);
}
}
}
}lct;
int main(){
n=read();m=read();
ll G=read(),S=read();
for(int i=1;i<=m;i++){
c[i].x=read();c[i].y=read();c[i].a=read()*G;c[i].b=read()*S;
}
sort(c+1,c+m+1,cmp);
for(int i=1;i<=m;i++){
if(c[i].x==c[i].y)continue;
lct.add(i+n,c[i]);
if(sz==n-1){
multiset<ll>::iterator it=s.end();
ll sum=(*(--it));
if(ans<0||sum+c[i].a<ans){
ans=sum+c[i].a;
}
}
}
write(ans);
return 0;
}