#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int deg[N];
struct info{
int f, s;
info(): f(1), s(1){};
info(int _f, int _s): f(_f), s(_s){};
void push(int x){
s = max(s, x);
if(f < s) swap(f, s);
}
int len(){
return f+s;
}
} dp[N];
bool vis[N];
int cnt;
int comp[N], best[N];
vector<int> adj[N];
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
while(m--){
int u, v;
cin >> u >> v;
deg[u]++;
deg[v]++;
adj[u].push_back(v);
adj[v].push_back(u);
}
queue<int> q;
for(int i = 1; i <= n; ++i){
if(vis[i]) continue;
cnt++;
q.push(i);
vis[i] = 1;
while(!q.empty()){
int u = q.front(); q.pop();
comp[u] = cnt;
for(int v : adj[u]){
if(vis[v]) continue;
vis[v] = 1;
q.push(v);
}
}
}
for(int i = 1; i <= n; ++i){
if(deg[i] == 1){
q.push(i);
}
}
while(!q.empty()){
int u = q.front(); q.pop();
// cerr << "Node : " << u << '\n';
for(auto v : adj[u]){
dp[u].push(dp[v].f+1);
if(--deg[v] == 1) q.push(v);
}
}
for(int i = 1; i <= n; ++i){
// cerr << "dbg : " << dp[i].f << " " << dp[i].s << '\n';
best[comp[i]] = max(best[comp[i]], dp[i].len() - 3);
}
int res = 0;
for(int i = 1; i <= cnt; ++i){
res += best[cnt];
}
cout << res << '\n';
}