// Задача "Острова"
// Шестая Интернет-олимпиада сезона 2009-2010, усложненный уровень
// Автор задачи: Роман Колганов, kolganov@rain.ifmo.ru
// Автор решения: Антон Банных, argentony@gmail.com

import java.io.*;
import java.util.*;
import java.math.*;

public class islands_ab implements Runnable {
    public static void main(String[] args) {
	new Thread(new islands_ab()).start();
    }

    @Override
    public void run() {
	try {
	    br = new BufferedReader(new FileReader("islands.in"));
	    out = new PrintWriter("islands.out");
	    solve();
	    out.close();
	} catch (Throwable e) {
	    e.printStackTrace();
	    System.exit(-1);
	}
    }

    BufferedReader br;
    StringTokenizer st;
    PrintWriter out;
    boolean eof = true;

    String cnv(String a) {
	return a.equals("") ? "0" : a;
    }

    String nextToken() {
	while (st == null || !st.hasMoreElements()) {
	    try {
		st = new StringTokenizer(br.readLine());
	    } catch (Exception e) {
		eof = true;
		return "";
	    }
	}
	return st.nextToken();
    }

    int nextInt() {
	return Integer.parseInt(cnv(nextToken()));
    }

    double nextDouble() {
	return Double.parseDouble(cnv(nextToken()));
    }

    final int MAX = 100000;
    
    long[] D, C;
    boolean[] u;
    ArrayList<Integer>[] g;
    
    long dfs(int i, int sz) {
	u[i] = true;
	for (int j : g[i]) {
	    if (!u[j]) {
		return dfs(j, sz + 1);
	    }
	}
	if (g[i].size() <= 1) {
	    return D[sz];
	} else {
	    return C[sz];
	}
    }
    
    private void solve() throws IOException {
	int n = nextInt();
	int m = nextInt();
	assert 1 <= n && n <= MAX;
	assert 0 <= m && m <= n;
	g = new ArrayList[n];
	for (int i = 0; i < n; ++i) {
	    g[i] = new ArrayList<Integer>();
	}
	for (int i = 0; i < m; ++i) {
	    int a = nextInt() - 1;
	    int b = nextInt() - 1;
	    g[a].add(b);
	    g[b].add(a);
	}
	
	for (int i = 0; i < n; ++i) {
	    assert g[i].size() <= 2;
	    if (g[i].size() == 2) {
		assert !g[i].get(0).equals(g[i].get(1));
	    }
	}
	
	D = new long[n + 1];
	D[1] = 0;
	for (int i = 2; i < D.length; ++i) {
	    D[i] = D[i - 1] + i * ((long)i - 1);
	}
	C = new long[n + 1];
	for (int i = 1; i < C.length; ++i) {
	    long j = (i + 1) / 2;
	    C[i] = i * j * (j - 1);
	    if (i % 2 == 0) {
		C[i] += i * j;
	    }
	}
	
	long ans = 0;
	u = new boolean[n];
	for (int i = 0; i < n; ++i) {
	    if (!u[i]) {
		ans += dfs(i, 1);
	    }
	}
	out.println(ans);
    }
}
