#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];
long long all, cur_val = -1e18;
long long f[200000], res[200001], best_val[200000];
vector<array<int, 3>> g[200000];
pair<int, int> p;
inline void DFS(int node, int par)
{
best_leave[node] = (g[node].size() == 1 ? node : -1);
for (auto &i : g[node])
{
if (i[0] != par)
{
DFS(i[0], node);
f[node] += f[i[0]] + i[2];
if (best_leave[node] == -1 || 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);
res[2] = max(res[2], f[node] + pre + val);
if (g[node].size() == 1)
{
if (node == 0)
{
p = {node, best_leave[node]};
cur_val = best_val[node];
}
else if (cur_val < val)
{
p = {node, leave};
cur_val = 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]);
}
}
}
}
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);
cin >> q;
while (q--)
{
cin >> a;
cout << all - res[a] << "\n";
}
return 0;
}