#include <bits/stdc++.h>
using namespace std;
int n,m;
vector<vector<int>> inp;
vector<int> low, num, dp;
vector<bool> vis;
int times = 0;
int ans_cur = 0;
void dfs(int u, int par)
{
low[u] = num[u] = ++times;
int child = 1;
int mx = 0;
for(int x: inp[u])
{
if(x == par) continue;
if(num[x] == 0)
{
dfs(x, u);
child++;
low[u] = min(low[u], low[x]);
if(low[x] == num[x])
{
mx = max(mx, dp[x] +1);
}
}
else if(num[x] < num[u]) low[u] = min(low[u], num[x]);
}
dp[u] = mx;
}
void dfs_vis(int u, int par)
{
int child = 0;
vis[u] = true;
int mx = 0;
int mx2 = 0;
for(int x: inp[u])
{
if(vis[x]) continue;
dfs_vis(x, u);
child++;
bool tmp = false;
if( low[x] == num[x]) { tmp = true; }
if(mx < dp[x] + tmp)
{
mx2 =mx;
mx = dp[x] + tmp;
}
else if( mx2 < dp[x] + tmp && mx >= dp[x] + tmp)
{
mx2 = dp[x] + tmp;
}
}
ans_cur = max(ans_cur, mx + mx2);
}
int main()
{
ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin >> n >>m;
inp.resize(n+1);
low.resize(n+1);
num.resize(n+1);
dp.resize(n+1);
for(int i =1; i<=m; i++)
{
int a,b; cin >> a >> b;
inp[a].push_back(b);
inp[b].push_back(a);
}
for(int i =1;i<=n; i++) if(num[i] == 0) dfs(i, i);
vis.resize(n+1);
int ans = 0;
for(int i =1; i<=n; i++)
{
if(vis[i] == false)
{
dfs_vis(i, i);
ans = max(ans, ans_cur);
ans_cur = 0;
}
}
cout << ans;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmludCBuLG07CnZlY3Rvcjx2ZWN0b3I8aW50Pj4gaW5wOwp2ZWN0b3I8aW50PiBsb3csIG51bSwgZHA7CnZlY3Rvcjxib29sPiB2aXM7CmludCB0aW1lcyA9IDA7CmludCBhbnNfY3VyID0gMDsKdm9pZCBkZnMoaW50IHUsIGludCBwYXIpCnsKCWxvd1t1XSA9IG51bVt1XSA9ICsrdGltZXM7CglpbnQgY2hpbGQgPSAxOwoJaW50IG14ID0gMDsKCWZvcihpbnQgeDogaW5wW3VdKQoJewoJCWlmKHggPT0gcGFyKSBjb250aW51ZTsKCQkKCQlpZihudW1beF0gPT0gMCkKCQl7CgkJCWRmcyh4LCB1KTsKCQkJY2hpbGQrKzsKCQkJbG93W3VdID0gbWluKGxvd1t1XSwgbG93W3hdKTsKCQkJCgkJCWlmKGxvd1t4XSA9PSBudW1beF0pCgkJCXsKCQkJCW14ID0gbWF4KG14LCBkcFt4XSArMSk7CgkJCX0KCQkJCgkJfQoJCWVsc2UgaWYobnVtW3hdIDwgbnVtW3VdKSBsb3dbdV0gPSBtaW4obG93W3VdLCBudW1beF0pOwoJfQoJZHBbdV0gPSBteDsKfQoKCnZvaWQgZGZzX3ZpcyhpbnQgdSwgaW50IHBhcikKewoJaW50IGNoaWxkID0gMDsKCXZpc1t1XSA9IHRydWU7CglpbnQgbXggPSAwOwoJaW50IG14MiA9IDA7Cglmb3IoaW50IHg6IGlucFt1XSkKCXsKCQlpZih2aXNbeF0pIGNvbnRpbnVlOwoJCWRmc192aXMoeCwgdSk7CgkJY2hpbGQrKzsKCQlib29sIHRtcCA9IGZhbHNlOwoJCWlmKCBsb3dbeF0gPT0gbnVtW3hdKSB7ICB0bXAgPSB0cnVlOyB9CgkJaWYobXggPCBkcFt4XSArIHRtcCkKCQl7CgkJCW14MiA9bXg7CgkJCW14ID0gZHBbeF0gICsgdG1wOwoJCQkKCQl9CgkJZWxzZSBpZiggbXgyICA8IGRwW3hdICsgdG1wICYmIG14ID49IGRwW3hdICsgdG1wKSAKCQl7CgkJCW14MiA9IGRwW3hdICsgdG1wOwoJCX0KCX0KCgkgYW5zX2N1ciA9IG1heChhbnNfY3VyLCAgbXggKyBteDIpOwp9CmludCBtYWluKCkKewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyBjaW4udGllKE5VTEwpOyBjb3V0LnRpZShOVUxMKTsKCWNpbiA+PiBuID4+bTsKCWlucC5yZXNpemUobisxKTsKCWxvdy5yZXNpemUobisxKTsKCW51bS5yZXNpemUobisxKTsKCWRwLnJlc2l6ZShuKzEpOwoJZm9yKGludCAgaSA9MTsgaTw9bTsgaSsrKQoJewoJCWludCBhLGI7IGNpbiA+PiBhID4+IGI7CgkJaW5wW2FdLnB1c2hfYmFjayhiKTsKCQlpbnBbYl0ucHVzaF9iYWNrKGEpOwoJfQoJCglmb3IoaW50IGkgPTE7aTw9bjsgaSsrKSBpZihudW1baV0gPT0gMCkgZGZzKGksIGkpOwoJdmlzLnJlc2l6ZShuKzEpOwoJaW50IGFucyA9IDA7Cglmb3IoaW50IGkgPTE7IGk8PW47IGkrKykKCXsKCQlpZih2aXNbaV0gPT0gZmFsc2UpCgkJewoJCQlkZnNfdmlzKGksIGkpOwoJCQlhbnMgPSBtYXgoYW5zLCBhbnNfY3VyKTsKCQkJYW5zX2N1ciA9IDA7CgkJfQoJfQoJY291dCA8PCBhbnM7CglyZXR1cm4gMDsKfQ==