#include <algorithm>
#include <cstdio>
#define LL long long
struct node{
	int u,v;
	LL w;
}g[400005];
int n,m,fa[200005],num;
LL d[200005],tot;
void add(int x,int y,int z)
{
	g[++num].u=x;  g[num].v=y;  g[num].w=z;
	return;
}
LL min(LL x,LL y)
{
	return x<y?x:y;
}
bool cmp(node x,node y)
{
	return x.w<y.w;
}
int find(int x)
{
	if (fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
void Kruskal()
{
	int i,j,k,fu,fv,cnt;
	for (i=0;i<n;i++)
	  fa[i]=i;
	std::sort(g+1,g+num+1,cmp);
	for (i=1;i<=num;i++)
	{
		fu=find(g[i].u);
		fv=find(g[i].v);
		if (fu!=fv)
		{
			fa[fv]=fu;
			cnt++;
			tot+=g[i].w;
			if (cnt==n-1) return;
		}
	}  
	return;
}
int main()
{
	int i,j,k,x,y;
	LL z;
	scanf("%d%d",&n,&m);
	for (i=0;i<n;i++)
	  d[i]=2e9;
	for (i=1;i<=m;i++)
	{
		scanf("%d%d%lld",&x,&y,&z);
		add(x,y,z);
		if (z+1<d[x]) d[x]=z+1;
		if (z+2<d[y]) d[y]=z+2;
	}
	for (k=1;k<=2;k++)
	  for (i=0;i<n;i++)
	    d[i]=min(d[i],d[(i+n-1)%n]+2);
	for (i=0;i<n;i++)
	  add(i,(i+1)%n,d[i]);
	Kruskal();  
//	printf("%d\n",num);  
	printf("%lld",tot);
	return 0;      
}