#include <bits/stdc++.h>
using namespace std;
const int maxn = 1100;
const int maxm = 10010;
struct Edge {
int to, nxt;
} e[maxm << 1];
int ecnt;
int head[maxn];
void addEdge(int u, int v) {
++ecnt;
e[ecnt].to = v;
e[ecnt].nxt = head[u];
head[u] = ecnt;
}
int n;
int m;
int dfn[maxn];
int low[maxn];
bool flag[maxn];
int timer,op;
void tarjan(int u, int father,int ggb) {
dfn[u]=low[u]=++timer;
int child=0;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==ggb) continue;
if(dfn[v]==0)
{ child++;
tarjan(v,u,ggb);
low[u]=min(low[u],low[v],ggb);
if(low[v]>=dfn[u]) op++;
}
else if(v!=father)
{
low[u]=min(low[u],dfn[v],ggb);
}
}
if(u==father&&child==1)
op++;
}
int biao[maxn];
int cnt,ans;
void dfs(int u)
{
cnt++;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(biao[v]==0)
{
biao[v]=1;
dfs(v);
}
}
}
int main() {
freopen("war.in","r",stdin);
freopen("war.out","w",stdout);
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) {
int u, v;
scanf("%d%d", &u, &v);
addEdge(u, v);
addEdge(v, u);
}
for(int i=1;i<=n;i++)
{
biao[i]=1;
int sum=0,k=0;
for(int j=1;j<=n;j++)
{
if(i!=j&&biao[j]==0)
{
cnt=0;
dfs(j);
sum++;
if(sum==1) k++;
}
}
if(sum==2)
{
if(k==1) ans+=n-2;
if(k==0) ans+=n-1;
}
if(sum>=3) ans+=n-1;
if(sum==1)
{
op=0;
for(int j=1;j<=n;j++)
{
if(i!=j&&dfn[i]==0)
{
tarjan(j,j,i);
}
}
ans+=op;
}
}
cout<<ans<<endl;
return 0;
}