#include<bits/stdc++.h>
using namespace std;

template <typename A, typename B>
string to_string(pair<A, B> p);

template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p);

template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p);

string to_string(const string& s) {
	return '"' + s + '"';
}

string to_string(const char* s) {
	return to_string((string) s);
}

string to_string(bool b) {
	return (b ? "true" : "false");
}

string to_string(vector<bool> v) {
	bool first = true;
	string res = "{";
	for (int i = 0; i < static_cast<int>(v.size()); i++) {
		if (!first) {
			res += ", ";
		}
		first = false;
		res += to_string(v[i]);
	}
	res += "}";
	return res;
}

template <size_t N>
string to_string(bitset<N> v) {
	string res = "";
	for (size_t i = 0; i < N; i++) {
		res += static_cast<char>('0' + v[i]);
	}
	return res;
}

template <typename A>
string to_string(A v) {
	bool first = true;
	string res = "{";
	for (const auto &x : v) {
		if (!first) {
			res += ", ";
		}
		first = false;
		res += to_string(x);
	}
	res += "}";
	return res;
}

template <typename A, typename B>
string to_string(pair<A, B> p) {
	return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}

template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p) {
	return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ")";
}

template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p) {
	return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ", " + to_string(get<3>(p)) + ")";
}

#define ar array<ll, 2>
#define ll long long
#define in insert
#define pb push_back
#define vt vector
#define P_Q(x) priority_queue<x>
#define p_q(x) priority_queue<x, vector<x>, greater<x>>
#define For(i, n) for(ll i = 0; i < n; i++)
#define Rev(i, n) for(ll i = n-1; i >= 0; i--)
#define FOR(i, n) for(ll i = 1; i <= n; i++)
#define REV(i, n) for(ll i = n; i >= 1; i--)
#define Rep(i,a,b) for(ll i = a; i <= b; i++)
#define all(x) (x).begin(),(x).end()
#define sz(x) (int) (x).size()

#define CERR cout
// #define CERR cerr

void debug_out() { CERR << endl; }

template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
	CERR << " " << to_string(H);
	debug_out(T...);
}

#ifndef ONLINE_JUDGE
#define dbg(...) CERR << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define dbg(...) 42
#endif

const ll mod = 998244353;
const ll INF = 1e18L + 5;
const ll mxN = 2e5 + 1;
ll n, k;

// remember to read no of test_cases
void solve()
{
	cin >> n >> k;
	set<ll> inter;
	vt<ll> a, b;
	For(i, k)
	{
		ll l, r;
		cin >> l >> r;
		Rep(i, l, r) inter.in(i);
	}
	ll prev = -1;
	a.pb(*inter.begin());
	for (ll num : inter)
	{
		if (num != prev + 1 && prev != -1)
		{
			b.pb(prev);
			a.pb(num);
		}
		prev = num;
	}
	b.pb(prev);
	k = sz(a);

	ll dp[n + 1] = {}, pref[n + 1] = {};
	dp[1] = 1;
	pref[1] = 1;
	Rep(i, 2, n)
	{
		For(j, k)
		{
			if (b[j] >= i - 1)
			{
				if (a[j] <= i - 1)
					dp[i] = (dp[i] + pref[i - a[j]]) % mod;
				break;
			}
			else
			{
				ll temp = (pref[i - a[j]] + mod - pref[i - b[j] - 1]) % mod;
				dp[i] = (dp[i] + temp) % mod;
			}
		}
		pref[i] = (pref[i - 1] + dp[i]) % mod;
	}
	cout << dp[n];
}

int main()
{
#ifndef ONLINE_JUDGE
	freopen("in.txt", "r", stdin);
	freopen("out.txt", "w", stdout);
#endif
	ios::sync_with_stdio(0);  cin.tie(0);
	ll t = 1;
	// cin >> t;
	FOR(tt, t) solve();
	return 0;
}

Measured memory_bytes: 15992