#include<iostream>
#include<queue>
#include<vector>
using namespace std;

const int MAXN = 3001;
vector<int> Adj[MAXN];
int Visited[MAXN], Ans[MAXN];

int DFS(int Now, int Parent) 
{
	if (Visited[Now]) return Now;
	
	Visited[Now] = 1;

	for (int Next : Adj[Now]) 
	{
		if (Next == Parent) continue;

		int Result = DFS(Next, Now);
		if (Result == -1) continue;
		if (Result == Now) return 0;
		return Visited[Now] = Result;
	}
	Visited[Now] = 0;
	return -1;
}

vector<int> nodeDistance(int s_nodes, vector<int> s_from, vector<int> s_to)
{
	for (int i = 0; i < s_nodes; ++i)
	{
		Adj[s_from[i] + 1].push_back(s_to[i] + 1);
		Adj[s_to[i] + 1].push_back(s_from[i] + 1);
	}
	DFS(1, -1);

	queue<int> q;
	for (int i = 1; i <= s_nodes; ++i) {
		if (Visited[i])
			q.push(i);
	}
	while (!q.empty()) {
		int Now = q.front();
		q.pop();
		for (int Next : Adj[Now]) {
			if (Visited[Next]) continue;
			Visited[Next] = 1;
			Ans[Next] = Ans[Now] + 1;
			q.push(Next);
		}
	}
	vector<int> Answer(s_nodes);
	for (int i = 0; i < s_nodes; ++i)
	{
		Answer[i] = Ans[i + 1];
	}
	return Answer;
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL);

	vector<int> s_from = { 0, 1, 0, 2, 0, 1 };
	vector<int> s_to = { 1, 2, 2, 4, 3, 5 };
	int s_nodes = 6;

	vector<int> result = nodeDistance(s_nodes, s_from, s_to);

	for (int i = 0; i < result.size(); ++i)
		cout << result[i] << " ";

	return 0;
}