import
java.util.*;
class
GFG{
static
int
N =
10000
;
@SuppressWarnings
(
"unchecked"
)
static
Vector<Integer>[] adj =
new
Vector[N];
static
int
[] lvl =
new
int
[N],
dist1 =
new
int
[N],
dist2 =
new
int
[N];
static
void
AddEdge(
int
u,
int
v)
{
adj[u].add(v);
adj[v].add(u);
}
static
int
end1, end2, maxi;
static
void
findFirstEnd(
int
u,
int
p)
{
lvl[u] =
1
+ lvl[p];
if
(lvl[u] > maxi)
{
maxi = lvl[u];
end1 = u;
}
for
(
int
i =
0
; i < adj[u].size(); i++)
{
if
(adj[u].elementAt(i) != p)
{
findFirstEnd(adj[u].elementAt(i), u);
}
}
}
static
void
clear(
int
n)
{
for
(
int
i =
0
; i <= n; i++)
{
lvl[i] =
0
;
}
maxi =
0
;
dist1[
0
] = dist2[
0
] = -
1
;
}
static
void
findSecondEnd(
int
u,
int
p)
{
lvl[u] =
1
+ lvl[p];
if
(lvl[u] > maxi)
{
maxi = lvl[u];
end2 = u;
}
for
(
int
i =
0
; i < adj[u].size(); i++)
{
if
(adj[u].elementAt(i) != p)
{
findSecondEnd(adj[u].elementAt(i), u);
}
}
}
static
void
findDistancefromFirst(
int
u,
int
p)
{
dist1[u] =
1
+ dist1[p];
for
(
int
i =
0
; i < adj[u].size(); i++)
{
if
(adj[u].elementAt(i) != p)
{
findDistancefromFirst(
adj[u].elementAt(i), u);
}
}
}
static
void
findDistancefromSecond(
int
u,
int
p)
{
dist2[u] =
1
+ dist2[p];
for
(
int
i =
0
; i < adj[u].size(); i++)
{
if
(adj[u].elementAt(i) != p)
{
findDistancefromSecond(
adj[u].elementAt(i), u);
}
}
}
static
void
findNodes()
{
int
n =
5
;
AddEdge(
1
,
2
);
AddEdge(
1
,
3
);
AddEdge(
3
,
4
);
AddEdge(
3
,
5
);
findFirstEnd(
1
,
0
);
clear(n);
findSecondEnd(end1,
0
);
findDistancefromFirst(end1,
0
);
findDistancefromSecond(end2,
0
);
for
(
int
i =
1
; i <= n; i++)
{
int
x = dist1[i];
int
y = dist2[i];
if
(x >= y)
{
System.out.print(end1 +
" "
);
}
else
{
System.out.print(end2 +
" "
);
}
}
}
public
static
void
main(String[] args)
{
for
(
int
i =
0
; i < N; i++)
{
adj[i] =
new
Vector<>();
}
findNodes();
}
}