#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3e5 + 5;
const int M = (1 << 20) + 5;
const int MOD = 998244353;
int sum[MAXN], dp[MAXN][41], fac[MAXN], inv[MAXN];
pair<int, int> p[MAXN], b[25];
int qpow(int x, int y) {
  int ret = 1;
  for (int i = y; i; i >>= 1) {
    if (i & 1) ret = 1LL * ret * x % MOD;
    x = 1LL * x * x % MOD;
  }
  return ret;
}
int C(int n, int m) {
  if (m > n || m < 0) return 0;
  return 1LL * fac[n] * inv[m] % MOD * inv[n - m] % MOD;
}
void inter(pair<int, int> &x, pair<int, int> y) {
  x.first = max(x.first, y.first);
  x.second = min(x.second, y.second);
}
void init() {
  fac[0] = 1;
  for (int i = 1; i < MAXN; i++) fac[i] = 1LL * fac[i - 1] * i % MOD;
  inv[MAXN - 1] = qpow(fac[MAXN - 1], MOD - 2);
  for (int i = MAXN - 2; i >= 0; i--) inv[i] = 1LL * inv[i + 1] * (i + 1) % MOD;
}
int main() {
  init();
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%d%d", &p[i].first, &p[i].second);
  for (int i = 0; i < m; i++) scanf("%d%d", &b[i].first, &b[i].second);
  for (int i = 1; i <= n; i++) {
    sum[p[i].first]++;
    sum[p[i].second + 1]--;
  }
  for (int i = 1; i <= n; i++) sum[i] += sum[i - 1];
  for (int i = 1; i <= n; i++)
    for (int j = 0; j <= m + m; j++)
      dp[i][j] = (1LL * dp[i - 1][j] + C(sum[i] - j, i - j)) % MOD;
  long long ans = 0;
  for (int st = 0; st < (1 << m); st++) {
    pair<int, int> in(1, n);
    set<int> tmp;
    for (int i = 0; i < m; i++) {
      if (((st >> i) & 1) == 0) continue;
      inter(in, p[b[i].first]);
      inter(in, p[b[i].second]);
      tmp.insert(b[i].first);
      tmp.insert(b[i].second);
    }
    if (in.first > in.second) continue;
    int cnt = __builtin_popcount(st);
    long long flag = cnt & 1 ? -1 : 1;
    cnt = tmp.size();
    ans =
        (ans + flag * (1LL * dp[in.second][cnt] - dp[in.first - 1][cnt] + MOD) %
                   MOD) %
        MOD;
  }
  cout << (ans + MOD) % MOD << endl;
  return 0;
}
