#include <bits/stdc++.h>
using namespace std;
int n,m;
struct Node
{
int v;
int id;
};
vector<vector<Node>> inp;
vector<int> low, num;
vector<bool>joint;
vector<bool> vis;
vector<int>dp;
stack<pair<int, int>> st;
int times = 0;
int ans = 0;
void dfs(int u, int par)
{
low[u] = num[u] = ++times;
int child = 0;
unordered_set<int> sett;
for(Node v: inp[u])
{
int x = v.v;
int id = v.id;
int minx = min(u, x);
int maxx = max(u, x);
if(id == par) continue;
if(num[x] == 0)
{
st.push({minx, maxx});
dfs(x, id);
low[u] = min(low[u], low[x]);
child++;
if(low[x] >= num[u])
{
while(st.top().first != minx || st.top().second != maxx)
{
sett.insert(st.top().first);
sett.insert(st.top().second);
st.pop();
}
st.pop();
ans = max(ans, (int)sett.size());
}
}
else if(num[x] < num[u]) { st.push({minx, maxx}); low[u] = min(low[u], num[x]); }
}
return;
}
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);
joint.resize(n+1);
for(int i =1; i<=m; i++)
{
int a,b; cin >> a >> b;
inp[a].push_back({b, i});
inp[b].push_back({a, i});
}
for(int i =1; i<=n; i++) if(num[i] == 0) dfs(i, -1);
cout << ans;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmludCBuLG07CnN0cnVjdCBOb2RlCnsKCWludCB2OwoJaW50IGlkOwp9Owp2ZWN0b3I8dmVjdG9yPE5vZGU+PiBpbnA7CnZlY3RvcjxpbnQ+IGxvdywgbnVtOwp2ZWN0b3I8Ym9vbD5qb2ludDsKdmVjdG9yPGJvb2w+IHZpczsKdmVjdG9yPGludD5kcDsKc3RhY2s8cGFpcjxpbnQsIGludD4+IHN0OwppbnQgdGltZXMgPSAwOwppbnQgYW5zID0gMDsKdm9pZCBkZnMoaW50IHUsIGludCBwYXIpCnsKCWxvd1t1XSA9IG51bVt1XSA9ICsrdGltZXM7CglpbnQgY2hpbGQgPSAwOwoJdW5vcmRlcmVkX3NldDxpbnQ+IHNldHQ7Cglmb3IoTm9kZSB2OiBpbnBbdV0pCgl7CgkJaW50IHggPSB2LnY7CgkJaW50IGlkID0gdi5pZDsKCQlpbnQgbWlueCA9IG1pbih1LCB4KTsKCQlpbnQgbWF4eCA9IG1heCh1LCB4KTsKCQlpZihpZCA9PSBwYXIpIGNvbnRpbnVlOwoJCWlmKG51bVt4XSA9PSAwKQoJCXsKCQkJc3QucHVzaCh7bWlueCwgbWF4eH0pOwoJCQlkZnMoeCwgaWQpOwoJCQkKCQkJbG93W3VdID0gbWluKGxvd1t1XSwgbG93W3hdKTsKCQkJY2hpbGQrKzsKCQkJaWYobG93W3hdID49IG51bVt1XSkKCQkJewoJCQkJCgkJCQl3aGlsZShzdC50b3AoKS5maXJzdCAhPSBtaW54IHx8IHN0LnRvcCgpLnNlY29uZCAhPSBtYXh4KQoJCQkJewoJCQkJCgkJCQkJc2V0dC5pbnNlcnQoc3QudG9wKCkuZmlyc3QpOwoJCQkJCXNldHQuaW5zZXJ0KHN0LnRvcCgpLnNlY29uZCk7CgkJCQkJc3QucG9wKCk7CgkJCQl9CgkJCQlzdC5wb3AoKTsKCQkJCWFucyA9IG1heChhbnMsIChpbnQpc2V0dC5zaXplKCkpOwoJCQl9CgkJfQoJCWVsc2UgaWYobnVtW3hdIDwgbnVtW3VdKSB7IHN0LnB1c2goe21pbngsIG1heHh9KTsgbG93W3VdID0gbWluKGxvd1t1XSwgbnVtW3hdKTsgfQoJfQoJcmV0dXJuOwp9CgoKaW50IG1haW4oKQp7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IGNpbi50aWUoTlVMTCk7IGNvdXQudGllKE5VTEwpOwoJY2luID4+IG4gPj4gbTsKCWlucC5yZXNpemUobisxKTsKCWxvdy5yZXNpemUobisxKTsKCW51bS5yZXNpemUobisxKTsKCWpvaW50LnJlc2l6ZShuKzEpOwoJZm9yKGludCBpID0xOyBpPD1tOyBpKyspCgl7CgkJaW50IGEsYjsgY2luID4+IGEgPj4gYjsKCQlpbnBbYV0ucHVzaF9iYWNrKHtiLCBpfSk7CgkJaW5wW2JdLnB1c2hfYmFjayh7YSwgaX0pOwoJfQoJCglmb3IoaW50IGkgPTE7IGk8PW47IGkrKykgaWYobnVtW2ldID09IDApIGRmcyhpLCAtMSk7Cgljb3V0IDw8IGFuczsKCQoJcmV0dXJuIDA7Cn0=