#include <bits/stdc++.h>
using namespace std;
const int mod = 998244353;
int l[300010], r[300010];
int f[300010], invf[300010], inv[300010];
int c[300010], u[30], v[30];
long long z[50][300010];
void add(long long *b, int p, long long x) {
  while (p < 300010) {
    b[p] += x;
    p += p & -p;
  }
}
long long sum(long long *b, int p) {
  long long res = 0;
  while (p > 0) {
    res += b[p];
    p -= p & -p;
  }
  return res;
}
inline int C(int n, int m) {
  if (n < 0 || m < 0 || m > n) return 0;
  return 1ll * f[n] * invf[m] % mod * invf[n - m] % mod;
}
int go(int L, int R, int p) {
  L = max(L, p);
  if (L > R) return 0;
  long long res = sum(z[p], R) - sum(z[p], L - 1);
  res %= mod;
  if (res < 0) res += mod;
  return res;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  f[1] = inv[1] = invf[1] = f[0] = invf[0] = 1;
  for (int i = 2; i < 300010; i++) {
    f[i] = f[i - 1] * 1ll * i % mod;
    inv[i] = mod - mod / i * 1ll * inv[mod % i] % mod;
    invf[i] = invf[i - 1] * 1ll * inv[i] % mod;
  }
  for (int i = 0; i < n; i++) {
    scanf("%d%d", &l[i], &r[i]);
    c[l[i]]++;
    c[r[i] + 1]--;
  }
  int t = 0;
  for (int i = 1; i <= n; i++) {
    t += c[i];
    c[i] = t;
    for (int j = 0; j <= m * 2; j++) {
      if (i >= j && c[i] >= j) {
        int q = C(c[i] - j, i - j);
        if (q > 0) add(z[j], i, q);
      }
    }
  }
  for (int i = 0; i < m; i++) {
    scanf("%d%d", &u[i], &v[i]);
    --u[i];
    --v[i];
  }
  int ans = 0;
  for (int i = 0; i < 1 << m; i++) {
    int L = 1, R = n, sgn = 1;
    vector<int> s;
    for (int j = 0; j < m; j++) {
      if (i >> j & 1) {
        s.push_back(u[j]);
        s.push_back(v[j]);
        sgn = -sgn;
      }
    }
    sort(s.begin(), s.end());
    s.resize(unique(s.begin(), s.end()) - s.begin());
    for (int j = 0; j < s.size(); j++) {
      L = max(L, l[s[j]]);
      R = min(R, r[s[j]]);
    }
    ans = ans + sgn * go(L, R, s.size());
    if (ans < 0) ans += mod;
    if (ans >= mod) ans -= mod;
  }
  printf("%d\n", ans);
  return 0;
}
