//题目大意:对于一个无向图,求删除两个点后能形成的最大连通分量个数。
//先枚举每一个点,删除后形成图G,在G上进行tarjan求割点,找出最大值即可。
#include <cstdio>
#include <vector>
#include <string.h>
using namespace std;
#define maxn 5020
vector <int> g[maxn];
int pre[maxn],low[maxn],iscut[maxn];
int n,m;
int dfs_clock;
int del;
int min(int a,int b)
{
if(a<b) return a;
else return b;
}
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
int dfs(int u,int fa)
{
int lowu=pre[u]=++dfs_clock;
int i;
for(i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(v==del) continue;
if(!pre[v])
{
int lowv=dfs(v,u);
lowu=min(lowu,lowv);
if(lowv>=pre[u]) iscut[u]++;
}
else if(pre[v]<pre[u]&&v!=fa)
lowu=min(lowu,pre[v]);
}
if(fa<0) iscut[u]--;
low[u]=lowu;
return lowu;
}
int main()
{
int sum=0;
int x,y;
int i,j,k;
int ans;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(k=0;k<n;k++) g[k].clear();
ans=0;
for(i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
for(i=0;i<n;i++)
{
del=i;
dfs_clock=0;
memset(pre,0,sizeof(pre));
memset(iscut,0,sizeof(iscut));
sum=0;
for(j=0;j<n;j++)
{
if(j==del) continue;
if(pre[j]==0)
{
dfs(j,-1);
sum++;
}
}
for(j=0;j<n;j++)
{
if(j==del) continue;
ans=max(ans,sum+iscut[j]);
}
}
printf("%d\n",ans);
}
return 0;
}