#include <bits/stdc++.h>
using namespace std;
const int64_t M1 = 998244353;
const int64_t M2 = 1000000007;
mt19937 rng((uint64_t)chrono::steady_clock::now().time_since_epoch().count());
vector<int64_t> f, inv;
int64_t mpow(int64_t a, int64_t b) {
  int64_t r = 1;
  while (b) {
    if (b & 1) r = (r * a) % M1;
    a = (a * a) % M1;
    b >>= 1;
  }
  return r;
}
int64_t ncr(int64_t n, int64_t m) {
  if (m > n || n < 0 || m < 0) return 0;
  return (f[n] * ((inv[m] * inv[n - m]) % M1)) % M1;
}
void solve() {
  int64_t n, m;
  cin >> n >> m;
  f.resize(n + 1, 1);
  inv.resize(n + 1);
  for (int64_t i = 1; i <= n; i++) f[i] = (f[i - 1] * i) % M1;
  inv[n] = mpow(f[n], M1 - 2);
  for (int64_t i = n - 1; ~i; i--) inv[i] = (inv[i + 1] * (i + 1)) % M1;
  vector<int64_t> l(n), r(n), a(n + 2, 0);
  for (int64_t i = 0; i < n; i++) {
    cin >> l[i] >> r[i];
    a[l[i]]++;
    a[r[i] + 1]--;
  }
  int64_t ans = 0;
  for (int64_t i = 1; i <= n; i++) {
    a[i] += a[i - 1];
  }
  vector<vector<int64_t>> dp(m * 2 + 1, vector<int64_t>(n + 1, 0));
  for (int64_t i = 1; i <= n; i++)
    for (int64_t j = 0; j <= m + m; j++)
      dp[j][i] = (dp[j][i - 1] + ncr(a[i] - j, i - j)) % M1;
  vector<tuple<int64_t, int64_t>> edges;
  for (int64_t i = 0; i < m; i++) {
    int64_t u, v;
    cin >> u >> v;
    edges.push_back({u - 1, v - 1});
  }
  for (int64_t mask = 0; mask < (1 << m); mask++) {
    int64_t x = 1;
    set<int64_t> bad;
    for (int64_t i = 0; i < m; i++) {
      if (!((mask >> i) & 1)) continue;
      x = (x * (M1 - 1)) % M1;
      bad.insert(get<0>(edges[i]));
      bad.insert(get<1>(edges[i]));
    }
    int64_t li = 1, ri = n;
    for (int64_t u : bad) {
      li = max(li, l[u]);
      ri = min(ri, r[u]);
    }
    if (li > ri) continue;
    int64_t sz = bad.size();
    ans = (ans + (x * ((dp[sz][ri] - dp[sz][li - 1] + M1) % M1)) % M1) % M1;
  }
  cout << ans << "\n";
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  solve();
}
