#include<bits/stdc++.h>
using namespace std;
#define int long long
bool maximize(int &a, int b){
if(a < b){
a = b;
return true;
}else return false;
}
bool minimize(int &a, int b){
if(b < a){
a = b;
return true;
}else return false;
}
const int maxn = 2e5 + 5;
int heavy[maxn], base[maxn], leaf[maxn], mx2[maxn], mx[maxn];
vector<array<int, 3>> adj[maxn];
vector<int> val;
void dfs1(int u, int p){
for(auto [v, w, _]: adj[u]){
if(v == p) continue;
base[1] += w;
dfs1(v, u);
}
}
void dfs2(int u, int p){
for(auto [v, w, c]: adj[u]){
if(v == p) continue;
base[v] = base[u] - w + c;
dfs2(v, u);
}
}
void dfs3(int u, int p){
leaf[u] = u;
for(auto [v, w, c]: adj[u]){
if(v == p) continue;
dfs3(v, u);
if(maximize(mx[u], mx[v] + w)) leaf[u] = leaf[v];
}
}
int root = 1, mn = 4e18;
void dfs4(int u, int p){
int m1 = 0, m2 = 0, leaf1 = u;
for(auto [v, w, _]: adj[u]){
if(v == p) continue;
int x = w + mx[v];
if(x > m1){
m2 = m1;
m1 = x;
leaf1 = leaf[v];
} else m2 = max(m2, x);
dfs4(v, u);
}
if(minimize(mn, base[u] - m1 - m2)) root = leaf1;
}
void dfs5(int u, int p){
heavy[u] = -1;
for(auto [v, w, _]: adj[u]){
if(v == p) continue;
dfs5(v, u);
if(maximize(mx2[u], w + mx2[v])) heavy[u] = v;
}
}
void decompose(int u, int p, int cur){
if(heavy[u] == -1){
val.push_back(cur);
return;
}
for(auto [v, w, _]: adj[u]){
if(v == p) continue;
if(v == heavy[u]) decompose(v, u, cur + w);
else decompose(v, u, w);
}
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n; cin >> n;
for(int i = 1; i <= n - 1; i++){
int u, v, c, d; cin >> u >> v >> c >> d;
adj[u].push_back({v, c, d});
adj[v].push_back({u, d, c});
}
dfs1(1, 0);
dfs2(1, 0);
dfs3(1, 0);
dfs4(1, 0);
dfs5(root, 0);
decompose(root, 0, 0);
sort(val.rbegin(), val.rend());
vector<int> ans(n + 1);
ans[1] = *min_element(base + 1, base + n + 1);
int cur = 0;
for(int i = 2; i <= n; i++){
if(i - 2 < val.size()) cur += val[i - 2];
ans[i] = base[root] - cur;
}
int q; cin >> q;
while(q--){
int x; cin >> x;
cout << ans[x] << "\n";
}
}