#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;
}