#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;
}