/* 
          使用了合并区间(力扣-56)的思想:
		  思想:
		  	   先对区间按照左边界进行排序,遍历所有区间,考虑:
			   (1)不重叠,直接加入res,
			   (2)有重叠,修改vector容器res中最后一个元素的右边界值 = max(当前遍历区间右边界,原右边界)
	   	  要点:
	   		1、【改进】第23行代码:判断边界为(L-1)。。。如:(1,3)(4,6)合并为(1,6),
			2、【学习】auto获取值时需引用,即引用后(*it)返回的是vector<int>,便可通过下标形式访问内部元素。					   (第46行代码)
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<vector<int>> merged(vector<vector<int>>& inputs) {
    if (inputs.size() == 0) {
        return {};
    }
    vector<vector<int>> res;
    for (int i = 0; i<inputs.size(); i++) {
        int L = inputs[i][0], R = inputs[i][1];
        if (res.size()==0 || res.back()[1] < L-1) {
            res.push_back({L, R});
        }
        else {
            res.back()[1] = max(res.back()[1],R);  // 注意取较大值。
        }
    }
    return res;
}

int main() {
    int len, n;
    while (cin >> len >> n) { // 注意 while 处理多个 case
        vector<vector<int>> inputs(n);
        for (int i = 0; i<n; i++) {
            int l,r;
            cin >> l >> r;
            inputs[i]={l,r};
        }
        sort(inputs.begin(), inputs.end());
        vector<vector<int>> res = merged(inputs);
        int cnt = len+1;
        for (auto it = res.begin(); it!=res.end(); it++) {
            cnt -= ((*it)[1]-(*it)[0]+1);
        }
        cout << cnt << endl;
    }
}
// 64 位输出请用 printf("%lld")