#include <bits/stdc++.h>
using namespace std;
const int N = 300043;
const int MOD = 998244353;
int add(int x, int y) { return ((x + y) % MOD + MOD) % MOD; }
int mul(int x, int y) { return (x * 1ll * y) % MOD; }
int binpow(int x, int y) {
  int z = 1;
  while (y > 0) {
    if (y % 2 == 1) z = mul(z, x);
    x = mul(x, x);
    y /= 2;
  }
  return z;
}
int inv(int x) { return binpow(x, MOD - 2); }
int fact[N];
int rfact[N];
void prepare_fact() {
  fact[0] = 1;
  for (int i = 1; i < N; i++) fact[i] = mul(i, fact[i - 1]);
  for (int i = 0; i < N; i++) rfact[i] = inv(fact[i]);
}
int c(int n, int k) {
  if (n < 0 || n < k || k < 0) return 0;
  return mul(fact[n], mul(rfact[k], rfact[n - k]));
}
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  vector<int> l(n), r(n), a(m), b(m);
  for (int i = 0; i < n; i++) scanf("%d %d", &l[i], &r[i]);
  for (int i = 0; i < m; i++) scanf("%d %d", &a[i], &b[i]);
  vector<int> cnt(n + 2);
  for (int i = 0; i < n; i++) {
    cnt[l[i]]++;
    cnt[r[i] + 1]--;
  }
  for (int i = 0; i < n + 1; i++) cnt[i + 1] += cnt[i];
  prepare_fact();
  vector<vector<int> > p(2 * m + 1, vector<int>(n + 1));
  for (int i = 1; i <= n; i++)
    for (int j = 0; j <= 2 * m; j++)
      p[j][i] = add(p[j][i - 1], c(cnt[i] - j, i - j));
  int ans = 0;
  for (int mask = 0; mask < (1 << m); mask++) {
    int sign = 1;
    set<int> used;
    for (int i = 0; i < m; i++)
      if (mask & (1 << i)) {
        sign = mul(sign, MOD - 1);
        used.insert(a[i] - 1);
        used.insert(b[i] - 1);
      }
    int L = 1, R = n;
    for (auto x : used) {
      L = max(L, l[x]);
      R = min(R, r[x]);
    }
    if (R < L) continue;
    ans = add(ans, mul(sign, add(p[used.size()][R], -p[used.size()][L - 1])));
  }
  printf("%d\n", ans);
}
