Problem:
Score : 1300 points

Problem Statement

We have a graph with N vertices, numbered 0 through N-1. Edges are yet to be added.

We will process Q queries to add edges.
In the i-th (1≦i≦Q) query, three integers A_i, B_i and C_i will be given, and we will add infinitely many edges to the graph as follows:

The two vertices numbered A_i and B_i will be connected by an edge with a weight of C_i.

The two vertices numbered B_i and A_i+1 will be connected by an edge with a weight of C_i+1.

The two vertices numbered A_i+1 and B_i+1 will be connected by an edge with a weight of C_i+2.

The two vertices numbered B_i+1 and A_i+2 will be connected by an edge with a weight of C_i+3.

The two vertices numbered A_i+2 and B_i+2 will be connected by an edge with a weight of C_i+4.

The two vertices numbered B_i+2 and A_i+3 will be connected by an edge with a weight of C_i+5.

The two vertices numbered A_i+3 and B_i+3 will be connected by an edge with a weight of C_i+6.

...

Here, consider the indices of the vertices modulo N.
For example, the vertice numbered N is the one numbered 0, and the vertice numbered 2N-1 is the one numbered N-1.

The figure below shows the first seven edges added when N=16, A_i=7, B_i=14, C_i=1:

After processing all the queries, find the total weight of the edges contained in a minimum spanning tree of the graph.

Constraints

2≦N≦200,000

1≦Q≦200,000

0≦A_i,B_i≦N-1

1≦C_i≦10^9

Input

The input is given from Standard Input in the following format:

N Q
A_1 B_1 C_1
A_2 B_2 C_2
:
A_Q B_Q C_Q

Output

Print the total weight of the edges contained in a minimum spanning tree of the graph.

Sample Input 1

7 1
5 2 1

Sample Output 1

21

The figure below shows the minimum spanning tree of the graph:

Note that there can be multiple edges connecting the same pair of vertices.

Sample Input 2

2 1
0 0 1000000000

Sample Output 2

1000000001

Also note that there can be self-loops.

Sample Input 3

5 3
0 1 10
0 2 10
0 4 10

Sample Output 3

42

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)

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

public class Main {

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

	static class Query implements Comparable<Query> {
		int from, to, cost;

		public Query(int from, int to, int cost) {
			this.from = from;
			this.to = to;
			this.cost = cost;
		}

		@Override
		public int compareTo(Query o) {
			return Integer.compare(cost, o.cost);
		}

	}

	int[] p;

	int get(int v) {
		return p[v] == v ? v : (p[v] = get(p[v]));
	}

	boolean unite(int a, int b) {
		a = get(a);
		b = get(b);

		if (a != b) {
			if (((a + b) & 1) == 1) {
				p[a] = b;
			} else {
				p[b] = a;
			}
		}

		return a != b;
	}

	void solve() throws IOException {
		int n = nextInt();
		int q = nextInt();

		PriorityQueue<Query> que = new PriorityQueue<>();

		for (int i = 0; i < q; i++) {
			int from = nextInt();
			int to = nextInt();
			int cost = nextInt();
			que.add(new Query(from, to, cost));
			que.add(new Query(to, (from + 1) % n, cost + 1));
		}

		p = new int[n];
		for (int i = 0; i < n; i++) {
			p[i] = i;
		}

		long ans = 0;

		while (!que.isEmpty()) {
			Query top = que.poll();

			// System.err.println(top.from + " " + top.to + " " + top.cost);

			if (unite(top.from, top.to)) {
				ans += top.cost;

				top.from = (top.from + 1) % n;
				top.to = (top.to + 1) % n;
				top.cost += 2;

				que.add(top);
			}
		}

		out.println(ans);
	}

	Main() throws IOException {
		br = new BufferedReader(new InputStreamReader(System.in));
		out = new PrintWriter(System.out);
		solve();
		out.close();
	}

	public static void main(String[] args) throws IOException {
		new Main();
	}

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

	String nextString() {
		try {
			return br.readLine();
		} catch (IOException e) {
			eof = true;
			return null;
		}
	}

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

	long nextLong() throws IOException {
		return Long.parseLong(nextToken());
	}

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