#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;
}