#include <bits/stdc++.h>
using namespace std;
int n, b, a;
const int maxn = (1e5) + 5;
vector<int> g[maxn];
vector<int> c[maxn];
int pod[maxn];
int parent[maxn];
int v[maxn];
int czas;
bitset<maxn> del;
int korzen;
int rozmiar;
vector<int> lvl[30];
char ans[maxn];
void poziomica(int x, int poz) {
  v[x] = czas;
  lvl[poz].push_back(x);
  for (int w : c[x]) {
    if (v[w] != czas) poziomica(w, poz + 1);
  }
}
void dfs(int x) {
  v[x] = czas;
  pod[x] = 1;
  rozmiar++;
  for (int w : g[x]) {
    if (v[w] != czas && !del[w]) {
      dfs(w);
      parent[w] = x;
      pod[x] += pod[w];
    }
  }
}
int centroid(int x, int root) {
  bool namiejscu = false;
  int poddrzewo;
  while (!namiejscu) {
    namiejscu = true;
    for (int w : g[x]) {
      if (del[w]) continue;
      if (w == parent[x]) {
        poddrzewo = pod[root] - pod[w] + 1;
      } else
        poddrzewo = pod[w];
      if (poddrzewo > (rozmiar / 2)) {
        namiejscu = false;
        x = w;
        break;
      }
    }
  }
  return x;
}
int decompose(int x, int ojciec) {
  czas++;
  rozmiar = 0;
  parent[x] = 0;
  dfs(x);
  int nc = centroid(x, x);
  del[nc] = 1;
  c[nc].push_back(ojciec);
  c[ojciec].push_back(nc);
  for (int w : g[nc]) {
    if (!del[w]) {
      decompose(w, nc);
    }
  }
  return nc;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < (n - 1); ++i) {
    scanf("%d %d", &a, &b);
    g[a].push_back(b);
    g[b].push_back(a);
  }
  korzen = decompose(1, 0);
  czas++;
  poziomica(korzen, 1);
  char lit = 'A';
  for (int i = 1; i <= (26); ++i) {
    for (int w : lvl[i]) {
      ans[w] = lit;
    }
    if (!lvl[i].empty()) lit++;
  }
  for (int i = 1; i <= (n); ++i) {
    printf("%c ", ans[i]);
  }
  printf("\n");
}
