#include <bits/stdc++.h>
using namespace std;
const int N = 3e6 + 5;
const int mod = 998244353;
long long l[300005], r[300005], a[22], b[22], cnt[300005], fact[300005],
    rev[300005], dp[300005][45];
long long nCk(long long n, long long k) {
  if (n < k || k < 0) return 0;
  return fact[n] * rev[n - k] % mod * rev[k] % mod;
}
long long binpow(long long u, long long p) {
  long long res = 1;
  long long cur = u;
  for (; p; p >>= 1) {
    if (p & 1) res = res * cur % mod;
    cur = cur * cur % mod;
  }
  return res;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  if (fopen("VietCT.INP", "r")) {
    freopen("VietCT.INP", "r", stdin);
    freopen("VietCT.OUT", "w", stdout);
  }
  long long n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    cin >> l[i] >> r[i];
    cnt[l[i]]++;
    cnt[r[i] + 1]--;
  }
  for (int i = 1; i <= m; i++) {
    cin >> a[i] >> b[i];
  }
  fact[0] = 1, rev[0] = 1;
  for (int i = 1; i <= 300000; i++) {
    fact[i] = fact[i - 1] * i % mod;
    rev[i] = binpow(fact[i], mod - 2);
  }
  for (int i = 1; i <= n; i++) {
    cnt[i] += cnt[i - 1];
    for (int j = 0; j <= (2 * m); j++) {
      dp[i][j] = (dp[i - 1][j] + nCk(cnt[i] - j, i - j)) % mod;
    }
  }
  long long ans = 0;
  for (int i = 0; i < (1 << m); i++) {
    vector<long long> val;
    long long lo = 1, hi = n;
    for (int j = 0; j < m; j++) {
      if (i & (1 << j)) {
        val.push_back({a[j + 1]});
        val.push_back({b[j + 1]});
        lo = max(lo, l[a[j + 1]]);
        lo = max(lo, l[b[j + 1]]);
        hi = min(hi, r[a[j + 1]]);
        hi = min(hi, r[b[j + 1]]);
      }
    }
    sort(val.begin(), val.end());
    val.resize(unique(val.begin(), val.end()) - val.begin());
    long long res = val.size();
    if (lo <= hi) {
      long long cost = (dp[hi][res] - dp[lo - 1][res] + mod) % mod;
      if (__builtin_popcount(i) & 1)
        ans = (ans - cost + mod) % mod;
      else
        ans = (ans + cost) % mod;
    }
  }
  cout << ans;
}
