#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (int i = (a); i <= (b); i++)
#define per(i, a, b) for (int i = (a); i >= (b); i--)
#define fi first
#define se second
typedef long long LL;
typedef pair <int, int> P;
const int inf = 0x3f3f3f3f, mod = 1e9 + 7, N = 3e5 + 10;
template <typename T>
inline void rd_(T &x) {
	x = 0; int f = 1;
	char ch = getchar();
	while (ch > '9' || ch < '0') { if (ch == '-') f = -1; ch = getchar(); }
	while (ch >= '0' && ch <= '9') x = x*10 + ch - '0', ch = getchar();
	x *= f;
}

int n, k, h[N], cnt, x, d[N], ans[N], len[N];
vector <int> vec[N];
struct Edge {
	int to, next;
} e[N<<1];
queue <int> q;
queue <P> q1;

void add_(int u, int v) {
	e[++cnt] = (Edge) {v, h[u]};
	h[u] = cnt;
}

int main() {
	rd_(n);
	for (int u, v, i = 1; i < n; i++) {
		rd_(u), rd_(v);
		add_(u, v), add_(v, u);
	}
	memset(d, -1, sizeof(d));
	rd_(k);
	rep (i, 1, k) {
		rd_(x), d[x] = 0;
		q.push(x);
	}
	while (!q.empty()) {
		int u = q.front(); q.pop();
		for (int v, i = h[u]; i; i = e[i].next) {
			v = e[i].to;
			if (~d[v]) continue;
			d[v] = d[u] + 1;
			q.push(v);
		}
	}
	rep (i, 1, n) vec[d[i]].push_back(i);
	per (k, n, 1) {
		rep (i, 0, (int) vec[k].size() - 1) {
			int u = vec[k][i];
			if (len[u] < d[u]) {
				if (!ans[u]) ans[u] = k;
				len[u] = k;
				q1.push(P(u, k));
			}
		}
		while (!q1.empty()) {
			int u = q1.front().fi, res = q1.front().se;
			q1.pop();
			if (!--res) continue;
			for (int v, i = h[u]; i; i = e[i].next) {
				v = e[i].to;
				if (len[v] < res) {
					if (!ans[v]) ans[v] = k;
					len[v] = res;
					q1.push(P(v, res));
				}
			}
 		}
	}
	rep (i, 1, n)
		printf("%d ", ans[i]);
}