#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 5;
const int maxm = 25;
const int maxmask = (1 << 20) + 5;
const long long mod = 998244353;
vector<int> add[maxn], del[maxn];
int a[maxm], b[maxm], num[maxmask], ppcnt[maxmask];
long long f[maxn], inv[maxn];
long long quick_pow(long long x, int times) {
  long long ret = 1;
  while (times) {
    if (times & 1) ret = ret * x % mod;
    x = x * x % mod;
    times >>= 1;
  }
  return ret;
}
long long binom(int x, int y) {
  if (x < y) return 0;
  return f[x] * inv[x - y] % mod * inv[y] % mod;
}
bool valid[maxn];
long long wys[maxm * 2];
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    int l, r;
    scanf("%d%d", &l, &r);
    add[l].push_back(i);
    del[r + 1].push_back(i);
  }
  for (int i = 1; i <= m; i++) scanf("%d%d", &a[i], &b[i]);
  for (int mask = 1; mask < (1 << m); mask++) {
    for (int i = 0; i < m; i++)
      if (mask & (1 << i)) {
        if (!valid[a[i + 1]]) {
          num[mask]++;
          valid[a[i + 1]] = true;
        }
        if (!valid[b[i + 1]]) {
          num[mask]++;
          valid[b[i + 1]] = true;
        }
      }
    for (int i = 0; i < m; i++)
      if (mask & (1 << i)) valid[a[i + 1]] = valid[b[i + 1]] = false;
    ppcnt[mask] = ppcnt[mask >> 1] + (mask & 1);
  }
  f[0] = 1;
  for (int i = 1; i <= n; i++) f[i] = f[i - 1] * i % mod;
  inv[n] = quick_pow(f[n], (int)mod - 2);
  for (int i = n - 1; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % mod;
  int cnt = 0, got = 0;
  long long ret = 0;
  wys[0] = 1;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < (int)add[i].size(); j++) {
      valid[add[i][j]] = true;
      cnt++;
    }
    for (int j = 0; j < (int)del[i].size(); j++) {
      valid[del[i][j]] = false;
      cnt--;
    }
    if (cnt < i) continue;
    int cur = 0;
    for (int j = 1; j <= m; j++)
      if (valid[a[j]] && valid[b[j]]) cur |= (1 << (j - 1));
    if (cur != got) {
      for (int j = 1; j <= num[cur]; j++) {
        wys[j] = binom(num[cur], j);
        for (int sub = cur; sub; sub = (sub - 1) & cur) {
          int alr = num[sub];
          if (alr > j) continue;
          wys[j] +=
              binom(num[cur] - alr, j - alr) * ((ppcnt[sub] & 1) ? -1 : 1);
        }
        wys[j] %= mod;
        wys[j] += (wys[j] < 0) * mod;
      }
      got = cur;
    }
    for (int j = 0; j <= num[got]; j++)
      if (i >= j) ret = (ret + wys[j] * binom(cnt - num[got], i - j)) % mod;
  }
  printf("%lld\n", ret);
  return 0;
}
