#include "bits/stdc++.h"
using namespace std;
#define SPEED ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
#define pb push_back
#define fi first
#define se second
#define endl "\n"
#define ALL(x) x.begin(), x.end()
#define sz(x) x.size()
#define intt long long
// #define intt int
const intt mod = 1e9 + 7;
const intt mxN = 4e5 + 5;
const intt inf = 1e18 + 10;
const intt L = 21;
vector<vector<intt>> graph, up;
map<pair<intt,intt>, intt> mp;
vector<pair<intt,intt>> cost;
vector<intt> val(mxN), in(mxN), out(mxN), subsum(mxN);
intt timer;
void dfs(intt node, intt parent) {
	in[node] = timer++;
	up[0][node] = parent;
	for(intt i = 1; i < L; i++) {
		up[i][node] = up[i-1][up[i-1][node]];
	}
	for(auto u : graph[node]) {
		if(u != parent) {
			dfs(u, node);
		}
	}
	out[node] = timer++;
}
bool isata(intt a, intt b) {
	return in[a] <= in[b] && out[a] >= out[b];
}
intt lca(intt a, intt b) {
	if(isata(a, b)) return a;
	if(isata(b, a)) return b;
	for(intt i = L - 1; i >= 0; i--) {
		if(!isata(up[i][a], b)) {
			a = up[i][a];
		}
	}
	return up[0][a];
}
void dfs2(intt node, intt parent) {
	subsum[node] = val[node];
	for(auto u : graph[node]) {
		if(u != parent) {
			dfs2(u, node);
			subsum[node] += subsum[u];
		}
	}
}
vector<intt> choose(mxN);
void dfs3(intt node, intt parent) {
	for(auto u : graph[node]) {
		if(u != parent) {
			dfs3(u, node);
		}
	}
	if(node == parent) return;
	
	intt idx = mp[{min(node, parent), max(node, parent)}];
	intt c1 = cost[idx].fi, c2 = cost[idx].se;
	// cout << "currently: " << min(node, parent) << " " << max(node, parent) << " :: " << c1 << " " << c2 << endl;
	choose[idx] = min(c1 * subsum[node], c2);
}
void solve() {
	intt N;
	cin >> N;
	graph.assign(N + 1, vector<intt> {});
	up.assign(L + 1, vector<intt>(N + 1, 0ll));
	for(intt i = 0; i < N-1; i++) {
		intt a, b, c1, c2;
		cin >> a >> b >> c1 >> c2;
		cost.pb({c1, c2});
		graph[a].pb(b);
		graph[b].pb(a);
		mp[{min(a,b),max(a,b)}] = i;
	}
	dfs(1, 1);
	for(intt i = 1; i < N; i++) {
		intt L = lca(i, i + 1);
		val[i]++; val[i+1]++;
		val[L]-=2;
	}
	dfs2(1, 1);
	dfs3(1, 1);
	intt ans = 0;
	// for(intt i = 1; i <= N; i++) {
	// 	cout << val[i] << " ";
	// }
	// cout << endl;
	// for(intt i = 1; i <= N; i++) {
	// 	cout << subsum[i] << " ";
	// }
	// cout << endl;
	for(intt i = 0; i < N - 1; i++) {
		// cout << choose[i] << " ";
		ans += choose[i];
	}
	// cout << endl;
	cout << ans << endl;
}
signed main() {
	SPEED;
	intt tst = 1;
  	// cin >> tst;
    	while (tst--) {
        	solve();
    	}
}
/*
	p00000
*/
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |