#include <bits/stdc++.h>
using namespace std;
void setup()
{
// #ifndef ONLINE_JUDGE
// freopen("test.inp", "r", stdin);
// freopen("test.out", "w", stdout);
// #endif
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
int n, q, a, b, c, d;
int best_leave[200000], pre_node[200000];
long long all;
long long f[200000], res[200001], best_val[200000];
vector<array<int, 3>> g[200000];
bool check[200000];
pair<int, int> p;
inline void DFS(int node, int par)
{
f[node] = 0;
pre_node[node] = par;
best_leave[node] = node;
best_val[node] = 0;
for (auto &i : g[node])
{
if (i[0] != par)
{
DFS(i[0], node);
f[node] += f[i[0]] + i[2];
if (best_val[i[0]] + i[1] > best_val[node])
{
best_val[node] = best_val[i[0]] + i[1];
best_leave[node] = best_leave[i[0]];
}
}
}
}
inline void DFS1(int node, int par, long long pre, int leave, long long val)
{
pair<int, long long> one = {leave, val}, two = {-1, 0};
res[1] = max(res[1], f[node] + pre);
if (f[node] + pre + val > res[2])
{
p = {node, leave};
res[2] = f[node] + pre + val;
}
for (auto &i : g[node])
{
if (i[0] != par)
{
if (best_val[i[0]] + i[1] >= one.second)
{
two = one;
one = {best_leave[i[0]], best_val[i[0]] + i[1]};
}
else if (best_val[i[0]] + i[1] >= two.second)
{
two = {best_leave[i[0]], best_val[i[0]] + i[1]};
}
}
}
for (auto &i : g[node])
{
if (i[0] != par)
{
if (best_leave[i[0]] == one.first)
{
DFS1(i[0], node, pre + f[node] - f[i[0]] - i[2] + i[1], two.first, two.second + i[2]);
}
else
{
DFS1(i[0], node, pre + f[node] - f[i[0]] - i[2] + i[1], one.first, one.second + i[2]);
}
}
}
}
inline void Process(int node)
{
long long cur;
priority_queue<pair<int, int>> pq;
pair<long long, int> temp;
DFS(node, node);
cur = f[node];
fill_n(check, n, 0);
pq.push({-best_val[node], best_leave[node]});
for (int i = 2; i <= n; ++i)
{
if (!pq.empty())
{
temp = pq.top();
pq.pop();
cur += -temp.first;
a = temp.second;
while (!check[a])
{
check[a] = true;
for (auto &j : g[a])
{
if (!check[j[0]])
{
pq.push({-best_val[j[0]], best_leave[j[0]] + j[1]});
}
}
a = pre_node[a];
}
}
res[i] = max(res[i], cur);
}
}
int main()
{
setup();
cin >> n;
for (int i = 0; i < n - 1; ++i)
{
cin >> a >> b >> c >> d;
g[a - 1].push_back({b - 1, c, d});
g[b - 1].push_back({a - 1, d, c});
all += c + d;
}
DFS(0, 0);
DFS1(0, 0, 0, 0, 0);
Process(p.first);
Process(p.second);
cin >> q;
while (q--)
{
cin >> a;
cout << all - res[a] << "\n";
}
return 0;
}