#include #define rep(i,a,b) for(int i = a; i < (b); ++i) #define sz(x) (int)(x).size() using namespace std; using ll = long long; using pi = pair; using vi = vector; struct op { int from; int to; int count; }; void solve() { int n; cin >> n; vector> neighs(n); vector> flows(n); vi lants(n); vi pars(n, -1); for (int i = 0; i < n-1; i++) { int a,b; cin >> a >> b; neighs[a].push_back(b); flows[a].push_back(0); neighs[b].push_back(a); flows[b].push_back(0); } int k; cin >> k; for (int i = 0; i < k; ++i) { int ix; cin >> ix; lants[ix] = 1; } vi target(n); for (int i = 0; i < k; ++ i){ int ix; cin >> ix; target[ix] = 1; } queue leaves; vector conns(n); for (int i = 0; i < n; ++i) { if (neighs[i].size() == 1) leaves.push(i); conns[i] = neighs[i].size(); } int root = -1; vector ops; while (!leaves.empty()) { int leaf = leaves.front(); leaves.pop(); lants[leaf] -= target[leaf]; assert(pars[leaf] == -1); bool par_found = false; for (int o : neighs[leaf]) { if (pars[o] == leaf) continue; par_found = true; lants[o] += lants[leaf]; pars[leaf] = o; if (lants[leaf] > 0) { ops.push_back({leaf, o, lants[leaf]}); lants[leaf] = 0; } conns[o] -= 1; if (conns[o] == 1) { leaves.push(o); } } if (!par_found) { root = leaf; assert(leaves.empty()); } } leaves.push(root); while (!leaves.empty()) { int leaf = leaves.front(); leaves.pop(); for (int o : neighs[leaf]) { if (o == pars[leaf]) continue; if (lants[o] < 0) { ops.push_back({leaf, o, -lants[o]}); } leaves.push(o); } } cout << ops.size() << "\n"; for (const auto& o : ops) { cout << o.from << " " << o.to << " " << o.count << "\n"; } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); solve(); }