#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define pb push_back
const int N=1e5+5,MAXA=1e6+5,inf=2e9+5,MOD=982451653;
vector<int> adj[N];
int low[N],depth[N],C,sz[N],ans=0;
void dfs(int node,int par){
depth[node]=depth[par]+1;
low[node]=depth[node]; sz[node]=1;
for(auto i:adj[node]){
if(i==par)continue;
if(!depth[i]){
dfs(i,node);
low[node]=min(low[node],low[i]);
sz[node]+=sz[i];
}
else low[node]=min(low[node],depth[i]);
}
}
multiset<int> bridge;
void dfs2(int node){
int minus=1;
for(auto i:adj[node]){
if(depth[i]==depth[node]+1 && low[i]>=depth[node])minus+=sz[i];
}
if(node!=C){
// cout<<C<<' '<<sz[C]<<' '<<(bridge.empty()?minus:*bridge.rbegin())<<endl;
ans+=sz[C]-(bridge.empty()?minus:*bridge.rbegin())-1;
}
for(auto i:adj[node]){
if(depth[i]==depth[node]+1){
if(low[i]>=depth[node] && node!=C)bridge.insert(minus);
dfs2(i);
if(low[i]>=depth[node] && node!=C)bridge.extract(minus);
}
}
}
signed main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n,m; cin>>n>>m;
for(int i=0;i<m;i++){
int x,y; cin>>x>>y;
adj[x].pb(y); adj[y].pb(x);
}
for(int c=1;c<=n;c++){
for(int j=1;j<=n;j++)low[j]=depth[j]=sz[j]=0; bridge.clear();
dfs(c,0);
C=c;
dfs2(c);
}
cout<<ans;
}