#include <iostream>
#include <vector>
using namespace std;

int n, m;
int cnt = 0;
vector<pair<int, int>> line;

// DFS:idx当前处理到第几条线,s每个点覆盖次数
void DFS(int idx, vector<int> s) {
    // 遍历完所有线,判断是否满足条件
    if (idx == m) {
        for (int num : s) {
            if (num < 2) return;
        }
        cnt++;
        return;
    }

    // 不选当前线
    DFS(idx + 1, s);

    // 选当前线(复制一份temp,不修改原s)
    vector<int> temp = s;
    int l = line[idx].first;
    int r = line[idx].second;
    for (int i = l - 1; i < r; i++) {
        temp[i]++;
    }
    DFS(idx + 1, temp);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> n >> m;
    line.resize(m);
    for (int i = 0; i < m; i++) {
        cin >> line[i].first >> line[i].second;
    }

    vector<int> s(n, 0);
    DFS(0, s);

    cout << cnt << endl;
    return 0;
}