#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <complex>
#include <algorithm>
#include <climits>
#include <queue>
#include <map>
#include <vector>
#include <iomanip>
#define
#define
#define
using namespace std;
struct node {
int next, to;
}edge[A];
int head[A], num_edge;
void add_edge(int from, int to) {
edge[++num_edge].next = head[from];
edge[num_edge].to = to;
head[from] = num_edge;
}
int n, m, a, b, f[A], cnt[A], ans;
void dfs(int fr, int fa) {
for (int i = head[fr]; i; i = edge[i].next) {
int ca = edge[i].to;
if (ca == fa) continue;
cnt[fr]++;
}
for (int i = head[fr]; i; i = edge[i].next) {
int ca = edge[i].to;
if (ca == fa) continue;
dfs(ca, fr);
ans = max(ans, f[fr] + f[ca] - 1 + (fa > 0 ? 1 : 0));
f[fr] = max(f[fr], f[ca] + cnt[fr]);
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> a >> b;
add_edge(a, b);
add_edge(b, a);
}
fill(f + 1, f + n + 1, 1);
dfs(1, 0);
cout << ans << endl;
}