rt
#include<cstdio>
#include<algorithm>
using namespace std;
struct EDGE{
int v,d1,d2,nxt;
}edge[400010];
int n,m,s,u,v,d1,d2,head[200010],dep[200010],e;
int fa[200010][21];
long long cha[200010],ans;
void add_edge(int u,int v,int d1,int d2){
e++;
edge[e].v=v;
edge[e].d1=d1;
edge[e].d2=d2;
edge[e].nxt=head[u];
head[u]=e;
}
void dfs(int x,int fat,int dp){
fa[x][0]=fat;
dep[x]=dp;
for(int i=1;i<=20;i++)
fa[x][i]=fa[fa[x][i-1]][i-1];
for(int i=head[x];i;i=edge[i].nxt)
if(edge[i].v!=fat) dfs(edge[i].v,x,dp+1);
}
int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(int i=20;i>=0;i--)
if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
for(int i=20;i>=0;i--)
if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
void dfs2(int x){
for(int i=head[x];i;i=edge[i].nxt){
if(edge[i].v==fa[x][0]) continue;
dfs2(edge[i].v);
cha[x]+=cha[edge[i].v];
if(cha[edge[i].v]*edge[i].d1<=edge[i].d2) ans+=cha[edge[i].v]*edge[i].d1;
else ans+=edge[i].d2;
}
return;
}
int main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d%d%d%d",&u,&v,&d1,&d2);
add_edge(u,v,d1,d2);
add_edge(v,u,d1,d2);
}
dfs(1,1,0);
for(int i=1;i<n;i++){
int j=i+1;
cha[i]++; cha[j]++;
cha[lca(i,j)]-=2;
}
dfs2(1);
printf("%lld\n",ans);
return 0;
}