#include "iostream"
#include "algorithm"
#include "cstring"
#include "cstdio"
#include "cmath"
#include "vector"
#include "map"
#include "set"
#include "queue"
using namespace std;
#define MAXN 200006
//#define int long long
#define rep(i, a, b) for (int i = (a), i##end = (b); i <= i##end; ++i)
#define per(i, a, b) for (int i = (a), i##end = (b); i >= i##end; --i)
#define pii pair<int,int>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define vi vector<int>
#define all(x) (x).begin() , (x).end()
#define mem( a ) memset( a , 0 , sizeof a )
typedef long long ll;
int n , m;
int A[MAXN];

vi G[MAXN];

int d[MAXN] , idx[MAXN] , pr[MAXN] , as[MAXN];

void dfs( int u , int f , int rem , int ds ) {
	if( rem <= pr[u] ) return;
	pr[u] = max( pr[u] , rem );
	as[u] = max( as[u] , ds );
	if( rem == 0 ) return;
	for( int v : G[u] ) if( v != f ) {
		dfs( v , u , rem - 1 , ds );
	}
}

void solve() {
	cin >> n;
	rep( i , 2 , n ) {
		int u , v;
		scanf("%d%d",&u,&v);
		G[u].pb( v ) , G[v].pb( u );
	}
	cin >> m;
	queue<int> Q;
	memset( d , -1 , sizeof d );
	rep( i , 1 , m ) {
		int s;
		scanf("%d",&s);
		Q.push( s );
		d[s] = 0;
	}
	while( !Q.empty() ) {
		int u = Q.front(); Q.pop();
		for( int v : G[u] ) if( d[v] == -1 ) {
			d[v] = d[u] + 1; Q.push( v );
		}
	}
	memset( pr , -1 , sizeof pr );
	rep( i , 1 , n ) idx[i] = i;
	sort( idx + 1 , idx + 1 + n , []( int a , int b ) { return d[a] > d[b]; } );
	rep( i , 1 , n ) if( d[idx[i]] ) {
		int u = idx[i];
		dfs( u , u , d[u] - 1 , d[u] );
	}
	rep( i , 1 , n ) printf("%d ",as[i]);
}

signed main() {
//    int T;cin >> T;while( T-- ) solve();
    solve();
}
