N
=
100005
v
=
[]
g
=
[]
vis
=
[
False
]
*
(N)
In
=
[
0
]
*
(N)
low
=
[
0
]
*
(N)
parent
=
[
0
]
*
(N)
rnk
=
[
0
]
*
(N)
bridges
=
[]
n, m
=
6
,
6
timer
=
0
diameter
=
0
def
swap(x, y):
temp
=
x
x
=
y
y
=
temp
def
find_set(a):
global
N, v, g, vis, In, low, parent, rnk, bridges, n, m, timer, diameter
if
parent[a]
=
=
a:
return
a
parent[a]
=
find_set(parent[a])
return
parent[a]
def
union_set(a, b):
global
N, v, g, vis, In, low, parent, rnk, bridges, n, m, timer, diameter
x, y
=
find_set(a), find_set(b)
if
x
=
=
y:
return
if
rnk[x]
=
=
rnk[y]:
rnk[x]
+
=
1
if
rnk[y] > rnk[x]:
swap(x, y)
parent[y]
=
x
def
dfsBridges(a, par):
global
N, v, g, vis, In, low, parent, rnk, bridges, n, m, timer, diameter
vis[a]
=
True
timer
+
=
1
In[a], low[a]
=
timer, timer
for
i
in
range
(
len
(v[a])):
if
v[a][i]
=
=
par:
continue
if
vis[v[a][i]]:
low[a]
=
min
(low[a], In[v[a][i]])
else
:
dfsBridges(v[a][i], a)
low[a]
=
min
(low[a], low[v[a][i]])
if
In[a] < low[v[a][i]]:
bridges.append([v[a][i], a])
else
:
union_set(v[a][i], a)
def
dfsDiameter(a, par):
global
N, v, g, vis, In, low, parent, rnk, bridges, n, m, timer, diameter
x, y
=
0
,
0
for
i
in
range
(
len
(g[a])):
if
g[a][i]
=
=
par:
continue
mx
=
dfsDiameter(g[a][i], a)
if
mx > x:
y
=
x
x
=
mx
elif
mx > y:
y
=
mx
diameter
=
max
(diameter, x
+
y)
return
x
+
1
def
findMaxBridges():
global
N, v, g, vis, In, low, parent, rnk, bridges, n, m, timer, diameter
for
i
in
range
(n
+
1
):
parent[i]
=
i
rnk[i]
=
1
dfsBridges(
1
,
0
);
if
len
(bridges)
=
=
0
:
return
0
head
=
-
1
for
i
in
range
(
len
(bridges)):
a
=
find_set(bridges[i][
0
])
b
=
find_set(bridges[i][
1
])
g[a].append(b)
g[b].append(a)
head
=
a
diameter
=
0
dfsDiameter(head,
0
)
return
diameter
for
i
in
range
(N):
v.append([])
for
i
in
range
(N):
g.append([])
v[
1
].append(
2
)
v[
2
].append(
1
)
v[
2
].append(
3
)
v[
3
].append(
2
)
v[
2
].append(
5
)
v[
5
].append(
2
)
v[
5
].append(
6
)
v[
6
].append(
5
)
v[
6
].append(
3
)
v[
3
].append(
6
)
v[
3
].append(
4
)
v[
4
].append(
4
)
ans
=
findMaxBridges()
print
(ans)