#include <bits/stdc++.h>
using namespace std;
int padre[3010], visita[3010], nivel[3010];
bool nodo_autopista[3010];
vector<int> grafo[3010];
int n;
void insertar(int u, int v) {
  grafo[u].push_back(v);
  grafo[v].push_back(u);
}
void mostrar() {
  for (int i = 0; i < 3010; i++) {
    if (grafo[i].size()) {
      cout << i << " : ";
      for (int j = 0; j < (int)grafo[i].size(); j++) cout << " " << grafo[i][j];
      cout << endl;
    }
  }
}
void ciclo(int v) {
  visita[v] = 2;
  int u;
  for (int i = 0; i < (int)grafo[v].size(); i++) {
    u = grafo[v][i];
    if (visita[u] == 0) {
      padre[u] = v;
      ciclo(u);
    } else {
      if (visita[u] == 2) {
        if (u != padre[v] && u != v) {
          nodo_autopista[u] = true;
          nodo_autopista[v] = true;
        }
      }
    }
  }
  visita[v] = 1;
}
int bfs(int origen) {
  memset(nivel, 0, sizeof(nivel));
  memset(visita, 0, sizeof(visita));
  queue<int> nodos;
  nodos.push(origen);
  while (!nodos.empty()) {
    int u = nodos.front();
    nodos.pop();
    for (int i = 0; i < (int)grafo[u].size(); i++) {
      int v = grafo[u][i];
      if (visita[v] == 0) {
        nodos.push(v);
        nivel[v] = 1 + nivel[u];
        visita[v] = 1;
        if (nodo_autopista[v]) return (nivel[v]);
      }
    }
  }
  return (0);
}
void autopista() {
  memset(nodo_autopista, false, sizeof(nodo_autopista));
  for (int i = 1; i <= n; i++) {
    if (!nodo_autopista[i]) {
      memset(visita, 0, sizeof(visita));
      memset(padre, -1, sizeof(padre));
      ciclo(i);
    }
  }
  if (nodo_autopista[1])
    printf("0");
  else
    printf("%d", bfs(1));
  for (int i = 2; i <= n; i++) {
    if (nodo_autopista[i])
      printf(" 0");
    else
      printf(" %d", bfs(i));
  }
  cout << endl;
}
void cerear() {
  for (int i = 0; i < 3010; i++) grafo[i].clear();
}
int main() {
  int u, v;
  while (scanf("%d", &n) == 1) {
    cerear();
    for (int i = 0; i < n; i++) {
      scanf("%d%d", &u, &v);
      insertar(u, v);
    }
    autopista();
  }
  return 0;
}
