//Let's join Kaede Takagaki Fan Club !!
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cassert>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <iostream>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <cassert>
#include <iomanip>
#include <chrono>
#include <random>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
#define int long long
#define L __int128
typedef long long ll;
typedef pair<int,int> P;
typedef pair<int,P> P1;
typedef pair<P,P> P2;
#define pu push
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define eps 1e-7
#define INF 1000000000
#define a first
#define b second
#define fi first
#define sc second
#define rng(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define rep(i,x) for(int i=0;i<x;i++)
#define repn(i,x) for(int i=1;i<=x;i++)
#define SORT(x) sort(x.begin(),x.end())
#define ERASE(x) x.erase(unique(x.begin(),x.end()),x.end())
#define POSL(x,v) (lower_bound(x.begin(),x.end(),v)-x.begin())
#define POSU(x,v) (upper_bound(x.begin(),x.end(),v)-x.begin())
#define all(x) x.begin(),x.end()
#define si(x) int(x.size())
 
#ifdef LOCAL
#define dmp(x) cerr<<__LINE__<<" "<<#x<<" "<<x<<endl
#else
#define dmp(x) void(0)
#endif
 
template<class t,class u> bool chmax(t&a,u b){if(a<b){a=b;return true;}else return false;}
template<class t,class u> bool chmin(t&a,u b){if(b<a){a=b;return true;}else return false;}
 
template<class t> using vc=vector<t>;
 
template<class t,class u>
ostream& operator<<(ostream& os,const pair<t,u>& p){
	return os<<"{"<<p.fi<<","<<p.sc<<"}";
}
 
template<class t> ostream& operator<<(ostream& os,const vc<t>& v){
	os<<"{";
	for(auto e:v)os<<e<<",";
	return os<<"}";
}
 
template<class T>
void g(T &a){
	cin >> a;
}
template<class T>
void o(const T &a,bool space=false){
	cout << a << (space?' ':'\n');
}
//ios::sync_with_stdio(false);
const ll mod = 1000000007;//998244353
mt19937_64 mt(chrono::steady_clock::now().time_since_epoch().count());
template<class T>
void add(T&a,T b){
	a+=b;
	if(a >= mod) a-=mod;
}
ll modpow(ll x,ll n){
	ll res=1;
	while(n>0){
		if(n&1) res=res*x%mod;
		x=x*x%mod;
		n>>=1;
	}
	return res;
}
#define sz 1
ll F[sz],R[sz];
void make(){
	F[0] = 1;
	for(int i=1;i<sz;i++) F[i] = F[i-1]*i%mod;
	for(int i=0;i<sz;i++) R[i] = modpow(F[i],mod-2);
}
ll C(int a,int b){
	if(b < 0 || a < b) return 0;
	return F[a]*R[b]%mod*R[a-b]%mod;
}
void solve(){
	unordered_set<int>ex;
	int n, m;
	cin >> n >> m;
	map<int, vc<int>>M;
	set<P>black;
	
	rep(i, m){
		int x,y; cin >> x >> y;
		M[x].pb(y);
		black.insert(mp(x, y));
	}
	ex.insert(n);
	for(auto at:M){
		vc<int>v = at.b;
		vc<int>zan;
		for(auto k:v){
			for(int a=k-1;a<=k+1;a++){
				if(ex.find(a) != ex.end()){
					zan.pb(a);
					ex.erase(ex.find(a));
				}
			}
		}
		for(auto a:zan){
			if(black.find(mp(at.a, a)) == black.end()) ex.insert(a);
			if(black.find(mp(at.a, a-1)) != black.end()) ex.insert(a-1);
			if(black.find(mp(at.a, a+1)) != black.end()) ex.insert(a+1);
		}
	}
	o(ex.size());
}
signed main(){
	cin.tie(0);
	ios::sync_with_stdio(0);
	cout<<fixed<<setprecision(20);
	int t; t = 1; //cin >> t;
	while(t--) solve();
}

#include <algorithm>
#include <iostream>
#include <map>
#include <vector>

using namespace std;

int main() {
    long long n, c;
    cin >> n >> c;

    vector<long long> ai(n), bi(n), ci(n);
    for (int i = 0; i < n; i++) {
        cin >> ai[i] >> bi[i] >> ci[i];
    }

    map<long long, long long> m;
    for (int i = 0; i < n; i++) {
        m[ai[i]] += ci[i];
        m[bi[i] + 1] -= ci[i];
    }

    vector<long long> d(0), s(0);
    for (map<long long, long long>::iterator i = m.begin(); i != m.end(); i++) {
        d.push_back(i->first);
        s.push_back(i->second);
    }

    for (int i = 1; i < static_cast<int>(d.size()); i++) {
        s[i] += s[i - 1];
    }

    long long res = 0;
    for (int i = 1; i < static_cast<int>(d.size()); i++) {
        res += (d[i] - d[i - 1]) * min(s[i - 1], c);
    }

    cout << res << endl;
}
