#include <bits/stdc++.h>
#include <stdio.h>
#define __Shibae__ signed main()
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define fiopen(Path) freopen(Path".INP", "r", stdin); freopen(Path".OUT", "w", stdout);
#define fipen(Path) freopen(Path".INP", "r", stdin);
#define sz(s) (int)s.size()
#define all(x) x.begin(), x.end()
#define maxHeap priority_queue<int>
#define minHeap priority_queue<int, vector<int>, greater<int>>
#define getBit(x, k) (((x) >> (k)) & 1)
#define MASK(i) (1LL << (i))
#define SQR(x) (1LL * ((x) * (x)))
#define db double
#define ld long double
#define ui unsigned int
#define ll long long
#define ii pair<int, int>
#define pli pair<ll, int>
#define pil pair<int, ll>
#define pll pair<ll, ll>
#define fi first
#define se second
#define FOR(i, a, b) for(int i = a, _b = b; i <= _b; i += 1)
#define FOD(i, a, b) for(int i = a, _b = b; i >= _b; i -= 1)
#define REP(i, a) for(int i = 0, _a = a; i < _a; i++)
#define pb push_back
#define fau(u, a) for(auto &u : a)
#define debug return cout << "debug", void();
using namespace std;
const ll mod = 1e9 + 7;
const int INF = 1e9 + 7;
const ll INFLL = (ll)2e18 + 7LL;
const ld PI = acos(-1);
const int MAX = 5e5+5;
const int dx[] = {1, -1, 0, 0, -1, 1, 1, -1};
const int dy[] = {0, 0, 1, -1, -1, -1, 1, 1};
mt19937 rd(chrono::steady_clock::now().time_since_epoch().count());
ll Rand(ll l, ll r)
{
return uniform_int_distribution<ll>(l, r)(rd);
}
template<class SHIBA, class ENGINE>
bool minimize(SHIBA &x, const ENGINE y)
{
if(x > y)
{
x = y;
return true;
}
else return false;
}
template<class SHIBA, class ENGINE>
bool maximize(SHIBA &x, const ENGINE y)
{
if(x < y)
{
x = y;
return true;
}
else return false;
}
/* Template by: Nguyen Nhat Anh from Luong Van Chanh High School for the gifted */
/* From Min Tuoi with love */
/** TRY HARD **/
/** ORZ **/
/* -----------------[ MAIN CODE ]----------------- */
int n, m;
vector<ii> g[MAX];
vector<int> adj[MAX];
int num[MAX], low[MAX], timer;
int cmp[MAX], cnt;
stack<int> st;
bool vis[MAX];
void input()
{
cin >> n >> m;
FOR(i, 1, m)
{
int u, v; cin >> u >> v;
g[u].pb({v, i});
g[v].pb({u, i});
}
}
void dfs(int u, int pre)
{
num[u] = low[u] = ++timer;
st.push(u);
for (auto [v, id] : g[u])
{
if (id == pre) continue;
if (num[v]) low[u] = min(low[u], num[v]);
else
{
dfs(v, id);
low[u] = min(low[u], low[v]);
}
}
if (num[u] == low[u])
{
++cnt;
int v = -36;
while(v != u)
{
v = st.top();
cmp[v] = cnt;
num[v] = low[v] = n+1;
st.pop();
}
}
}
ii dfss(int u, int pre)
{
ii res = {0, u};
fau(v, adj[u])
{
if (v == pre) continue;
ii tmp = dfss(v, u);
tmp.fi++;
maximize(res, tmp);
}
return res;
}
void mark(int u, int pre)
{
vis[u] = 1;
fau(v, adj[u])
{
if (v == pre) continue;
mark(v, u);
}
}
int get(int root)
{
mark(root, -1);
ii tt = dfss(root, -1);
return dfss(tt.se, -1).fi;
}
void solve()
{
FOR(i, 1, n) if (!num[i]) dfs(i, -1);
FOR(i, 1, n)
{
for (auto [v, id] : g[i])
{
if (cmp[i] != cmp[v])
{
adj[cmp[i]].pb(cmp[v]);
}
}
}
FOR(i, 1, cnt)
{
sort(all(adj[i]));
adj[i].resize(unique(all(adj[i])) - adj[i].begin());
}
int res = 0;
FOR(i, 1, cnt) if (!vis[i]) maximize(res, get(i));
cout << res;
}
__Shibae__
{
IOS
const bool multitest = 0;
int tt = 1; if(multitest) cin >> tt;
while( tt-- ){
input();
solve();
if(tt) cout << "\n";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKI2RlZmluZSBfX1NoaWJhZV9fICAgICAgc2lnbmVkIG1haW4oKQojZGVmaW5lIElPUyAgICAgICAgICAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiNkZWZpbmUgZmlvcGVuKFBhdGgpICAgIGZyZW9wZW4oUGF0aCIuSU5QIiwgInIiLCBzdGRpbik7IGZyZW9wZW4oUGF0aCIuT1VUIiwgInciLCBzdGRvdXQpOwojZGVmaW5lIGZpcGVuKFBhdGgpICAgICBmcmVvcGVuKFBhdGgiLklOUCIsICJyIiwgc3RkaW4pOwojZGVmaW5lIHN6KHMpICAgICAgICAgICAoaW50KXMuc2l6ZSgpCiNkZWZpbmUgYWxsKHgpICAgICAgICAgIHguYmVnaW4oKSwgeC5lbmQoKQojZGVmaW5lIG1heEhlYXAgICAgICAgICBwcmlvcml0eV9xdWV1ZTxpbnQ+CiNkZWZpbmUgbWluSGVhcCAgICAgICAgIHByaW9yaXR5X3F1ZXVlPGludCwgdmVjdG9yPGludD4sIGdyZWF0ZXI8aW50Pj4KI2RlZmluZSBnZXRCaXQoeCwgaykgICAgKCgoeCkgPj4gKGspKSAmIDEpCiNkZWZpbmUgTUFTSyhpKSAgICAgICAgICgxTEwgPDwgKGkpKQojZGVmaW5lIFNRUih4KSAgICAgICAgICAoMUxMICogKCh4KSAqICh4KSkpCiNkZWZpbmUgZGIgICAgICAgICAgICAgIGRvdWJsZQojZGVmaW5lIGxkICAgICAgICAgICAgICBsb25nIGRvdWJsZQojZGVmaW5lIHVpICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQKI2RlZmluZSBsbCAgICAgICAgICAgICAgbG9uZyBsb25nCiNkZWZpbmUgaWkgICAgICAgICAgICAgIHBhaXI8aW50LCBpbnQ+CiNkZWZpbmUgcGxpICAgICAgICAgICAgIHBhaXI8bGwsIGludD4KI2RlZmluZSBwaWwgICAgICAgICAgICAgcGFpcjxpbnQsIGxsPgojZGVmaW5lIHBsbCAgICAgICAgICAgICBwYWlyPGxsLCBsbD4KI2RlZmluZSBmaSAgICAgICAgICAgICAgZmlyc3QKI2RlZmluZSBzZSAgICAgICAgICAgICAgc2Vjb25kCgojZGVmaW5lIEZPUihpLCBhLCBiKSAgICBmb3IoaW50IGkgPSBhLCBfYiA9IGI7IGkgPD0gX2I7IGkgKz0gMSkKI2RlZmluZSBGT0QoaSwgYSwgYikgICAgZm9yKGludCBpID0gYSwgX2IgPSBiOyBpID49IF9iOyBpIC09IDEpCiNkZWZpbmUgUkVQKGksIGEpICAgICAgIGZvcihpbnQgaSA9IDAsIF9hID0gYTsgaSA8IF9hOyBpKyspCiNkZWZpbmUgcGIgICAgICAgICAgICAgIHB1c2hfYmFjawojZGVmaW5lIGZhdSh1LCBhKSAgICAgICBmb3IoYXV0byAmdSA6IGEpCiNkZWZpbmUgZGVidWcgICAgICAgICAgIHJldHVybiBjb3V0IDw8ICJkZWJ1ZyIsIHZvaWQoKTsKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBsbCBtb2QgPSAxZTkgKyA3Owpjb25zdCBpbnQgSU5GID0gMWU5ICsgNzsKY29uc3QgbGwgSU5GTEwgPSAobGwpMmUxOCArIDdMTDsKY29uc3QgbGQgUEkgPSBhY29zKC0xKTsKY29uc3QgaW50IE1BWCA9IDVlNSs1OwogCmNvbnN0IGludCBkeFtdID0gezEsIC0xLCAwLCAwLCAtMSwgMSwgMSwgLTF9Owpjb25zdCBpbnQgZHlbXSA9IHswLCAwLCAxLCAtMSwgLTEsIC0xLCAxLCAxfTsKCm10MTk5MzcgcmQoY2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKTsKCmxsIFJhbmQobGwgbCwgbGwgcikgCnsKICAgIHJldHVybiB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248bGw+KGwsIHIpKHJkKTsKfQoKdGVtcGxhdGU8Y2xhc3MgU0hJQkEsIGNsYXNzIEVOR0lORT4KICAgIGJvb2wgbWluaW1pemUoU0hJQkEgJngsIGNvbnN0IEVOR0lORSB5KQogICAgewogICAgICAgIGlmKHggPiB5KQogICAgICAgIHsKICAgICAgICAgICAgeCA9IHk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gCiAgICAgICAgZWxzZSByZXR1cm4gZmFsc2U7CiAgICB9CnRlbXBsYXRlPGNsYXNzIFNISUJBLCBjbGFzcyBFTkdJTkU+CiAgICBib29sIG1heGltaXplKFNISUJBICZ4LCBjb25zdCBFTkdJTkUgeSkKICAgIHsKICAgICAgICBpZih4IDwgeSkKICAgICAgICB7CiAgICAgICAgICAgIHggPSB5OwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSByZXR1cm4gZmFsc2U7CiAgICB9CgoKLyogVGVtcGxhdGUgYnk6IE5ndXllbiBOaGF0IEFuaCBmcm9tIEx1b25nIFZhbiBDaGFuaCBIaWdoIFNjaG9vbCBmb3IgdGhlIGdpZnRlZCAqLwovKiBGcm9tIE1pbiBUdW9pIHdpdGggbG92ZSAqLwogICAgICAgIC8qKiAgICAgICBUUlkgSEFSRCAgICAgICAgKiovCiAgICAgICAgLyoqICAgICAgICAgIE9SWiAgICAgICAgICAqKi8KCi8qIC0tLS0tLS0tLS0tLS0tLS0tWyBNQUlOIENPREUgXS0tLS0tLS0tLS0tLS0tLS0tICovCgppbnQgbiwgbTsKdmVjdG9yPGlpPiBnW01BWF07CnZlY3RvcjxpbnQ+IGFkaltNQVhdOwppbnQgbnVtW01BWF0sIGxvd1tNQVhdLCB0aW1lcjsKaW50IGNtcFtNQVhdLCBjbnQ7CnN0YWNrPGludD4gc3Q7CmJvb2wgdmlzW01BWF07Cgp2b2lkIGlucHV0KCkKewogICAgY2luID4+IG4gPj4gbTsKCiAgICBGT1IoaSwgMSwgbSkKICAgIHsKICAgICAgICBpbnQgdSwgdjsgY2luID4+IHUgPj4gdjsKICAgICAgICBnW3VdLnBiKHt2LCBpfSk7CiAgICAgICAgZ1t2XS5wYih7dSwgaX0pOwogICAgfQp9Cgp2b2lkIGRmcyhpbnQgdSwgaW50IHByZSkKewogICAgbnVtW3VdID0gbG93W3VdID0gKyt0aW1lcjsKICAgIHN0LnB1c2godSk7CiAgICBmb3IgKGF1dG8gW3YsIGlkXSA6IGdbdV0pCiAgICB7CiAgICAgICAgaWYgKGlkID09IHByZSkgY29udGludWU7CiAgICAgICAgaWYgKG51bVt2XSkgbG93W3VdID0gbWluKGxvd1t1XSwgbnVtW3ZdKTsKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBkZnModiwgaWQpOwogICAgICAgICAgICBsb3dbdV0gPSBtaW4obG93W3VdLCBsb3dbdl0pOwogICAgICAgIH0KICAgIH0KICAgIGlmIChudW1bdV0gPT0gbG93W3VdKQogICAgewogICAgICAgICsrY250OwogICAgICAgIGludCB2ID0gLTM2OwogICAgICAgIHdoaWxlKHYgIT0gdSkKICAgICAgICB7CiAgICAgICAgICAgIHYgPSBzdC50b3AoKTsKICAgICAgICAgICAgY21wW3ZdID0gY250OwogICAgICAgICAgICBudW1bdl0gPSBsb3dbdl0gPSBuKzE7CiAgICAgICAgICAgIHN0LnBvcCgpOwogICAgICAgIH0KICAgIH0KfQoKaWkgZGZzcyhpbnQgdSwgaW50IHByZSkKewogICAgaWkgcmVzID0gezAsIHV9OwogICAgZmF1KHYsIGFkalt1XSkKICAgIHsKICAgICAgICBpZiAodiA9PSBwcmUpIGNvbnRpbnVlOwogICAgICAgIGlpIHRtcCA9IGRmc3ModiwgdSk7CiAgICAgICAgdG1wLmZpKys7CiAgICAgICAgbWF4aW1pemUocmVzLCB0bXApOwogICAgfQogICAgcmV0dXJuIHJlczsKfQoKdm9pZCBtYXJrKGludCB1LCBpbnQgcHJlKQp7CiAgICB2aXNbdV0gPSAxOwogICAgZmF1KHYsIGFkalt1XSkKICAgIHsKICAgICAgICBpZiAodiA9PSBwcmUpIGNvbnRpbnVlOwogICAgICAgIG1hcmsodiwgdSk7CiAgICB9Cn0KCmludCBnZXQoaW50IHJvb3QpCnsKICAgIG1hcmsocm9vdCwgLTEpOwogICAgaWkgdHQgPSBkZnNzKHJvb3QsIC0xKTsKCiAgIHJldHVybiBkZnNzKHR0LnNlLCAtMSkuZmk7Cn0KCnZvaWQgc29sdmUoKQp7CiAgICBGT1IoaSwgMSwgbikgaWYgKCFudW1baV0pIGRmcyhpLCAtMSk7CiAgICBGT1IoaSwgMSwgbikKICAgIHsKICAgICAgICBmb3IgKGF1dG8gW3YsIGlkXSA6IGdbaV0pCiAgICAgICAgewogICAgICAgICAgICBpZiAoY21wW2ldICE9IGNtcFt2XSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWRqW2NtcFtpXV0ucGIoY21wW3ZdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIEZPUihpLCAxLCBjbnQpIAogICAgewogICAgICAgIHNvcnQoYWxsKGFkaltpXSkpOwogICAgICAgIGFkaltpXS5yZXNpemUodW5pcXVlKGFsbChhZGpbaV0pKSAtIGFkaltpXS5iZWdpbigpKTsKICAgIH0KICAgIGludCByZXMgPSAwOwogICAgRk9SKGksIDEsIGNudCkgaWYgKCF2aXNbaV0pIG1heGltaXplKHJlcywgZ2V0KGkpKTsKICAgIGNvdXQgPDwgcmVzOwp9CgpfX1NoaWJhZV9fCnsKICAgIElPUwoKICAgIGNvbnN0IGJvb2wgbXVsdGl0ZXN0ID0gMDsKICAgIGludCB0dCA9IDE7IGlmKG11bHRpdGVzdCkgY2luID4+IHR0OwogCiAgICB3aGlsZSggdHQtLSApewogICAgICAgIGlucHV0KCk7CiAgICAgICAgc29sdmUoKTsKICAgICAgICBpZih0dCkgY291dCA8PCAiXG4iOwogICAgfQogCiAgICByZXR1cm4gMDsKfQ==