#include <iostream>
#include <vector>
using namespace std;
int line[10][2];
int n, m, ans;
const int p = 998244353;
bool judge(vector<int> *v) {
int diff[200005];
fill(diff, diff + 200005, 0);
for (vector<int>::iterator it = v -> begin(); it != v -> end(); it++) {
//区间修改
int index = *it;
int l = line[index][0];
int r = line[index][1];
diff[l] += 1;
//边界n + 1不需要考虑,因为无意义,只需防止数组越界就行int a[n + 1]
diff[r + 1] -= 1;
}
int tmp = diff[0];
for (int i = 1; i <= n; i++) {
tmp += diff[i];
if (tmp < 2) return false;
}
return true;
}
void dfs(int deep, vector<int> *v) {
int tmp;
if (deep == m + 1) {
if (judge(v)) ans = (tmp = ans + 1) == p ? 0 : tmp;
return;
}
v -> push_back(deep - 1);
dfs(deep + 1, v);
v -> pop_back();
dfs(deep + 1, v);
}
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
cin >> line[i][0] >> line[i][1];
}
vector<int> v;
//对于数组是编译时静态确定大小,大小属于类型的一部分,但是参数只支持指针/值, 因此对于数组参数存在退化问题, vector是动态确定大下对象,作为参数传递对象地址&v,不需要传大小
dfs(1, &v);
cout << ans;
}