#include <bits/stdc++.h>
using namespace std;
int64_t power(int64_t a, int64_t b) {
  int64_t ans = 1;
  while (b) {
    if (b & 1) {
      ans = (ans * a) % (int64_t)(1e9 + 7);
    }
    a = (a * a) % (int64_t)(1e9 + 7);
    b >>= 1;
  }
  return ans;
}
int64_t mmi(int64_t n) { return power(n, (int64_t)(1e9 + 7) - 2); }
int64_t two(int64_t n) { return 1 << n; }
void onbit(int64_t &n, int64_t x) { n |= two(x); }
void offbit(int64_t &n, int64_t x) { n &= ~two(x); }
int64_t cntbit(int64_t n) {
  int64_t res = 0;
  while (n and ++res) n -= n & -n;
  return res;
}
int64_t dx[] = {-1, 0, 1, 0}, dy[] = {0, -1, 0, 1};
vector<int64_t> g[3005];
int64_t vis[3005], mark[3005], par[3005], dist[3005], n;
void dfs(int64_t u, int64_t p) {
  int64_t i;
  vis[u] = 1;
  par[u] = p;
  for (i = 0; i < g[u].size(); i++) {
    if (!vis[g[u][i]]) {
      dfs(g[u][i], u);
    } else if (g[u][i] != p and g[u][i] != par[u]) {
      int64_t x = u;
      while (x != g[u][i]) {
        mark[x] = 1;
        x = par[x];
      }
      mark[g[u][i]] = 1;
    }
  }
  vis[u] = 0;
}
void dfs2(int64_t u, int64_t d) {
  int64_t i;
  vis[u] = 1;
  dist[u] = d;
  for (i = 0; i < g[u].size(); i++) {
    if (!vis[g[u][i]] and !mark[g[u][i]]) {
      dfs2(g[u][i], d + 1);
    }
  }
}
void solve() {
  int64_t i;
  cin >> n;
  for (i = 0; i < n; i++) {
    int64_t x, y;
    cin >> x >> y;
    g[x].push_back(y);
    g[y].push_back(x);
  }
  dfs(1, 0);
  for (i = 1; i < n + 1; i++) vis[i] = 0;
  for (i = 1; i < n + 1; i++) {
    if (mark[i]) {
      dfs2(i, 0);
    }
  }
  for (i = 1; i < n + 1; i++) cout << dist[i] << " ";
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int64_t t = 1;
  while (t--) {
    solve();
  }
  return 0;
}
