/*
                                                  
  _|_|                              _|  _|    _|  
_|    _|  _|  _|_|  _|_|_|_|        _|  _|  _|    
_|    _|  _|_|          _|          _|  _|_|      
_|    _|  _|          _|      _|    _|  _|  _|    
  _|_|    _|        _|_|_|_|    _|_|    _|    _|  
                                                                                                    
*/ 
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<set>
//#define ls (rt<<1)
//#define rs (rt<<1|1)
#define vi vector<int>
#define pb push_back
#define mk make_pair
#define pii pair<int,int>
#define rep(i,a,b) for(int i=(a),i##end=(b);i<=i##end;i++)
#define fi first
#define se second
typedef long long ll;
using namespace std;
const int maxn=2e5+1000;
vi side[maxn];
int dp[maxn];
queue<pii>q;
int vis[maxn];
bool flag=0;
vector<pii> st;
bool cmp(pii a,pii b){return a.fi>b.fi;}
int buc[maxn];
void dfs(int u,int dis,int ndis,int lim){
	dp[u]=max(dp[u],dis);
	if(lim<=ndis)return;
	if(lim-ndis<=buc[u])return;
	buc[u]=lim-ndis;
	for(int i=0;i<side[u].size();i++){
		int v=side[u][i];//if(vis[v]>dis)continue;
		dfs(v,dis,ndis+1,lim);
	}
}
int main(){
	int n;scanf("%d",&n);
	rep(i,1,n-1){
		int u,v;scanf("%d%d",&u,&v);
		side[u].pb(v);side[v].pb(u);
	}
	int k;scanf("%d",&k);
	rep(i,1,k){
		int a;scanf("%d",&a);
		vis[a]=1;q.push(mk(a,0));
	}
	while(!q.empty()){
		int u=q.front().fi,dis=q.front().se;q.pop();
		dp[u]=dis;st.pb(mk(dis,u));
		for(int i=0;i<side[u].size();i++){
			int v=side[u][i];if(vis[v])continue;
			vis[v]=1;q.push(mk(v,dis+1));
		}
	}
	sort(st.begin(),st.end(),cmp);
	
	memset(vis,0,sizeof(vis));
	for(int i=0;i<st.size();i++){
		int u=st[i].se,dis=st[i].fi;
		//if(!vis[u]||vis[u]==dis)
		dfs(u,dis,0,dis-1);
	//	if(n>=100)cout<<i<<' ';
	}
	rep(i,1,n)printf("%d ",dp[i]);
	return 0;
}
