#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;

const int N = 5002;
vector<int> G[N];

int del, n;

int num[N], low[N], fa[N], clk;
int add[N];
bool iscut[N];
	
void dfs(int x){
	num[x] = low[x] = ++clk;
	int ch = 0;
	add[x] = 0;
	for(int i = 0; i < G[x].size(); i++){
		int y = G[x][i]; 
		if(del == y) continue;
		if(num[y] == 0){
			ch++;
			fa[y] = x;
			dfs(y);
			if(low[y] >= num[x]){ iscut[x] = true; add[x]++;}
			low[x] = min(low[x], low[y]);
		}
		else if(y != fa[x])
			low[x] = min(low[x], num[y]);
	}
	if(fa[x] < 0){
		if(ch == 1) iscut[x] = false;
		else add[x]--;
	} 
}
	
int solve(int n){
	int ret = 0;
	memset(num, 0, sizeof(num));
	memset(iscut, 0, sizeof(iscut));
	clk = 0;
	for(int i = 0; i < n; i++) if(num[i] == 0 && del != i){
		fa[i] = -1; dfs(i); ret++;
	}
	return ret;
}

int gao(){
	int before = solve(n), maxadd = 0;
	if(before == n - 1) before--;
	for(int i = 0; i < n; i++) 
		if(iscut[i])
			maxadd = max(maxadd, add[i]);
	return maxadd + before;
}

void clear(){
	for(int i = 0; i < n; i++) G[i].clear();
}

int main(){
	int m;
	while(2 == scanf("%d %d", &n, &m)){
		clear();
		while(m--){
			int a, b;
			scanf("%d %d", &a, &b);
			G[a].push_back(b);
			G[b].push_back(a);
		}
		int ans = 1;
		for(int i = 0; i < n; i++){
			del = i;
			ans = max(ans, gao());
		}
		printf("%d\n", ans);
	}
	return 0;
}
