#include <bits/stdc++.h>
using namespace std;

const int N = 100005;
typedef long long ll;
int n, tot = 1, u[N], v[N], nxt[2 * N], fst[N], to[2 * N], size[N];
ll s[N], w[N], res;

void dfs(int u, int fa)
{
	size[u] = 1;
	for (int i = fst[u]; i; i = nxt[i])
		if (to[i] != fa)
		{
			dfs(to[i], u);
			size[u] += size[to[i]];
			if (size[to[i]] * 2 != n)
				w[i >> 1] = (s[u] - s[to[i]]) / (2 * size[to[i]] - n);
		}
}

void bf(int u, int fa)
{
	size[u] = 1;
	for (int i = fst[u]; i; i = nxt[i])
		if (to[i] != fa)
			bf(to[i], u), res += size[to[i]] * w[i >> 1], size[u] += size[to[i]];
}

int main()
{
	scanf("%d", &n);
	for (int i = 1; i < n; i++)
	{
		scanf("%d%d", u + i, v + i);
		nxt[++tot] = fst[u[i]]; fst[u[i]] = tot; to[tot] = v[i];
		nxt[++tot] = fst[v[i]]; fst[v[i]] = tot; to[tot] = u[i];
	}
	for (int i = 1; i <= n; i++) scanf("%lld", s + i);
	dfs(1, 0);
	for (int i = 1; i < n; i++)
		if (!w[i])
		{
			bf(u[i], v[i]), bf(v[i], u[i]);
			w[i] = (s[u[i]] - res) / size[v[i]];
		}
	for (int i = 1; i < n; i++) printf("%lld\n", w[i]);
	return 0;
}
