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