#include #include using namespace std; using ll = long long; // #define int ll int n, k; constexpr int MAXN = 200'000; vector adj[MAXN]; int s1[MAXN], s2[MAXN], V[MAXN]; struct Elem { Elem(int ff, int tt, int vv) : f(ff), t(tt), v(vv) {} int f, t, v; }; vector ans; void dfs1(int v, int p) { for (auto x : adj[v]) { if (x == p) continue; dfs1(x, v); } if (s1[v]) V[v]++; if (s2[v]) V[v]--; if (V[v] > 0) { ans.emplace_back(v, p, V[v]); } V[p] += V[v]; } void dfs2(int v, int p) { for (auto x : adj[v]) { if (x == p) continue; if (V[x] < 0) { ans.emplace_back(v, x, -V[x]); } dfs2(x, v); } } int find_leaf() { int v = 0, p = 0; while (adj[v].size() != 1) { if (adj[v][0] != p) { p = v; v = adj[v][0]; } else { p = v; v = adj[v][1]; } } return v; } signed main() { cin >> n; for (int i = 1; i < n; i++) { int x, y; cin >> x >> y; adj[x].push_back(y); adj[y].push_back(x); } cin >> k; for (auto A : {s1, s2}) { for (int i = 0; i < k; i++) { int x; cin >> x; A[x] = 1; } } int v = find_leaf(); dfs1(v, v); // for (int i = 0; i < n; i++) { // cout << V[i] << ' '; // } // cout << endl; dfs2(v, v); cout << ans.size() << endl; for (auto [f, t, v] : ans) { cout << f << ' ' << t << ' ' << v << endl; } }