#include <bits/stdc++.h>
using namespace std;
const long long MOD = 998244353;
template <typename T>
struct BIT {
  long long n;
  vector<T> bit[2];
  vector<T> for_bubblesort;
  void init(long long n_) {
    n = n_ + 1;
    for (long long j = 0; j < 2; j++) {
      bit[j].assign(n, 0);
    }
  }
  void add_sub(long long p, long long i, T x) {
    for (long long j = i; j < n; j += j & -j) {
      bit[p][j] += x;
      bit[p][j] %= MOD;
    }
  }
  void add(long long l, long long r, T x) {
    add_sub(0, l, -x * (l - 1));
    add_sub(0, r + 1, x * r);
    add_sub(1, l, x);
    add_sub(1, r + 1, -x);
  }
  T sum_sub(long long p, long long i) {
    T s(0);
    for (long long j = i; j > 0; j -= j & -j) {
      s += bit[p][j];
      s %= MOD;
    }
    return s;
  }
  T sum(long long i, long long j) {
    return (sum_sub(0, j) + sum_sub(1, j) * j - sum_sub(0, i - 1) -
            sum_sub(1, i - 1) * (i - 1)) %
           MOD;
  }
};
int main() {
  long long N, K;
  long long count = 0;
  cin >> N >> K;
  BIT<long long> rock;
  rock.init(3 * N);
  vector<pair<long long, long long>> vec(K);
  for (long long i = 0; i < K; i++) {
    long long a, b;
    cin >> a >> b;
    vec.at(i) = {a, b};
  }
  rock.add(1, 1, 1);
  for (long long i = 0; i < N - 1; i++) {
    long long x = rock.sum(i + 1, i + 1) % MOD;
    for (long long j = 0; j < K; j++) {
      rock.add(i + 1 + vec.at(j).first, i + 1 + vec.at(j).second, x);
    }
  }
  cout << rock.sum(N, N) % MOD << endl;
}
