import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
Graph graph = new Graph();
for(int i=1 ; i<=m ; i++){
int x=sc.nextInt();
int y=sc.nextInt();
if(graph.vertices.get(x+"")==null)
{
graph.addVertex(x+"");
}
if(graph.vertices.get(y+"")==null)
{
graph.addVertex(y+"");
}
graph.addEdge(x+"" , y+"" , 0);
}
ArrayList<ArrayList<String>> al = new ArrayList<>();
al = graph.getConnectedComponents();
int ans=0 , size=0;
for(int i=0 ; i<al.size() ; i++) {
ans += size*al.get(i).size();
size += al.get(i).size();
}
System.out.println(ans);
}
public static class Graph{
private class Vertex{
HashMap<String , Integer> neighbour = new HashMap<>();
}
HashMap<String , Vertex> vertices ;
public Graph(){
vertices = new HashMap<>();
}
public void addVertex(String add) {
Vertex vtx = new Vertex();
vertices.put(add , vtx);
}
public void addEdge(String vname1 , String vname2 , int length) {
Vertex vtx1 = vertices.get(vname1);
Vertex vtx2 = vertices.get(vname2);
if(vtx1==null || vtx2==null || vtx1.neighbour.containsKey(vname2))
return;
vtx1.neighbour.put(vname2 , length);
vtx2.neighbour.put(vname1 , length);
}
public ArrayList< ArrayList<String> > getConnectedComponents() {
ArrayList< ArrayList<String> > finalans = new ArrayList<>();
HashMap<String , Boolean> processed = new HashMap<>();
LinkedList<pair> queue = new LinkedList<>();
ArrayList<String> keys = new ArrayList<>(vertices.keySet());
// for every node repeat the process
for(String key:keys)
{
// this is used when graph is broken or not linked directly
if(processed.containsKey(key))
continue;
// for new cycle , create a new arraylist
ArrayList<String> subans = new ArrayList<>();
pair sourcepair = new pair(key , key);
queue.addLast(sourcepair);
while(!queue.isEmpty())
{
pair remove = queue.removeFirst();
if(processed.containsKey(remove.vertexname))
continue;
processed.put(remove.vertexname , true);
// put it in subans list
subans.add(remove.vertexname);
Vertex removedvtx = vertices.get(remove.vertexname);
ArrayList<String> neighbours = new ArrayList<>(removedvtx.neighbour.keySet());
for(String neighbour : neighbours)
{
if(!processed.containsKey(neighbour))
{
pair add = new pair(neighbour , remove.pathsofar+neighbour);
queue.addLast(add);
}
}
}
// put subans in final ans
finalans.add(subans);
}
return finalans;
}
private class pair{
String vertexname;
String pathsofar;
pair(){
}
pair(String vertexname , String pathsofar){
this.vertexname=vertexname;
this.pathsofar=pathsofar;
}
}
}
}