#include <bits/stdc++.h>   using namespace std;   vector<vector<long long>> gr;   vector<bool> used;   vector<long long> tin, up;   const long long Nmax = 400000;   long long p[Nmax];   long long sz[Nmax];   long long timer = 0;   long long diametr(long long u, vector<vector<long long>> gr) {     queue<long long> q;     long long n = (long long)(gr.size());     vector<long long> h(n + 1, -1);     q.push(u);     h[u] = 0;     long long ml = u;     while (!q.empty()) {       long long v = q.front();       q.pop();       for (long long x : gr[v]) {         if (h[x] == -1) {           h[x] = h[v] + 1;           if (h[x] > h[ml]) ml = x;           q.push(x);         }       }     }     vector<long long> prev(n + 1, -1);     h.assign(n + 1, -1);     q.push(ml);     h[ml] = 0;     long long ms = ml;     prev[ml] = ml;     while (!q.empty()) {       long long v = q.front();       q.pop();       for (long long x : gr[v]) {         if (prev[x] == -1) {           h[x] = h[v] + 1;           prev[x] = v;           if (h[x] > h[ms]) ms = x;           q.push(x);         }       }     }     vector<long long> res;     while (prev[ms] != ms) {       res.push_back(ms);       ms = prev[ms];     }     res.push_back(ms);     reverse((res).begin(), (res).end());     return (long long)(res.size()) - 1;   }   long long find(long long x) {     if (p[x] != x) {       p[x] = find(p[x]);     }     return p[x];   }   void merge(long long x, long long y) {     x = find(x);     y = find(y);     p[y] = x;   }   void restart(long long N) {     for (long long i = 0; i < N; ++i) {       sz[i] = 1;       p[i] = i;     }   }   vector<pair<long long, long long>> most;   void dfs(long long u, long long p) {     used[u] = true;     tin[u] = timer++;     up[u] = tin[u];     for (long long v : gr[u]) {       if (used[v] && v != p) up[u] = min(up[u], tin[v]);       if (!used[v]) {         dfs(v, u);         up[u] = min(up[u], up[v]);         if (tin[u] < up[v]) {           most.emplace_back(u, v);         } else {           merge(u, v);         }       }     }   }   void solve() {     long long n, m;     cin >> n >> m;     gr.resize(n);     tin.assign(n, 0);     up.assign(n, 0);     used.assign(n, 0);     restart(n);     for (long long i = (0); i < (m); ++i) {       long long u, v;       cin >> u >> v;       u--;       --v;       gr[u].push_back(v);       gr[v].push_back(u);     }     dfs(0, -1);     vector<vector<long long>> gr2(n);     if (most.empty()) {       cout << 0;       return;     }     for (long long i = (0); i < ((long long)(most.size())); ++i) {       long long u = most[i].first, v = most[i].second;       u = find(u);       v = find(v);       gr2[u].push_back(v);       gr2[v].push_back(u);     }     long long v = most[0].first;     v = find(v);     cout << diametr(v, gr2);   }   signed main() {     ios::sync_with_stdio(0);     cin.tie(0);     long long t;     t = 1;     while (t--) {       solve();     }     return 0;   }   