#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int random(int st, int dr)
{
    uniform_int_distribution<int> dist(st, dr);
    return dist(rng);
}
template <typename t>
using ordered_set = tree<t, null_type, less<t>, rb_tree_tag, tree_order_statistics_node_update>;
const int mod = 1e9 + 7;
struct Mint
{
    int val;
    Mint(int x = 0)
    {
        val = x % mod;
    }
    Mint(long long x)
    {
        val = x % mod;
    }
    Mint operator+(Mint oth)
    {
        return val + oth.val;
    }
    Mint operator-(Mint oth)
    {
        return val - oth.val + mod;
    }
    Mint operator*(Mint oth)
    {
        return 1ll * val * oth.val;
    }
    void operator+=(Mint oth)
    {
        val = (*this + oth).val;
    }
    void operator-=(Mint oth)
    {
        val = (*this - oth).val;
    }
    void operator*=(Mint oth)
    {
        val = (*this * oth).val;
    }
};
Mint powmod(int a, int b)
{
    if (b == 0)
    {
        return 1;
    }
    if (b % 2 == 1)
    {
        return powmod(a, b - 1) * a;
    }
    Mint p = powmod(a, b / 2);
    return p * p;
}
/*
                 .___                 __                 __           .__
  ____  ____   __| _/____     _______/  |______ ________/  |_  ______ |  |__   ___________   ____
_/ ___\/  _ \ / __ |/ __ \   /  ___/\   __\__  \\_  __ \   __\/  ___/ |  |  \_/ __ \_  __ \_/ __ \
\  \__(  <_> ) /_/ \  ___/   \___ \  |  |  / __ \|  | \/|  |  \___ \  |   Y  \  ___/|  | \/\  ___/
 \___  >____/\____ |\___  > /____  > |__| (____  /__|   |__| /____  > |___|  /\___  >__|    \___  >
     \/           \/    \/       \/            \/                 \/       \/     \/            \/
*/
const int nmax = 5e5;
const int sigma = 26;
Mint dp[nmax + 1][sigma + 1][3];
int32_t main()
{
    cin.tie(nullptr)->sync_with_stdio(false);
    int n, m;
    cin >> n >> m;
    vector<vector<int>> a(n + 1, vector<int>(2));
    for (int i = 1; i <= m; ++i)
    {
        int x, y;
        cin >> x >> y;
        if (x < y)
        {
            a[x][0] = max(a[x][0], y);
        }
        else
        {
            a[y][1] = max(a[y][1], x);
        }
    }
    for (int i = 1; i <= n; ++i)
    {
        for (int s = 1; s <= sigma; ++s)
        {
            int need = 0;
            for (int j = i; j >= 1; --j)
            {
                if (a[j][0] > i)
                {
                    need |= 1;
                }
                if (a[j][1] > i)
                {
                    need |= 2;
                }
                if (need == 3)
                {
                    break;
                }
                if (j == 1)
                {
                    dp[i][s][need] += 1;
                    continue;
                }
                for (int need2 = 0; need2 <= 2; ++need2)
                {
                    if (need2 == 0)
                    {
                        for (int s2 = 1; s2 <= sigma; ++s2)
                        {
                            if (s != s2)
                            {
                                dp[i][s][need] += dp[j - 1][s2][need2];
                            }
                        }
                    }
                    if (need2 == 1)
                    {
                        for (int s2 = s + 1; s2 <= sigma; ++s2)
                        {
                            dp[i][s][need] += dp[j - 1][s2][need2];
                        }
                    }
                    if (need2 == 2)
                    {
                        for (int s2 = 1; s2 < s; ++s2)
                        {
                            dp[i][s][need] += dp[j - 1][s2][need2];
                        }
                    }
                }
            }
        }
    }
    Mint ans = 0;
    for (int i = 1; i <= sigma; ++i)
    {
        ans += dp[n][i][0];
    }
    cout << ans.val << '\n';
}
/*
I cannot take this anymore
Saying everything I've said before
All these words, they make no sense
I find bliss in ignorance
Less I hear, the less you say
You'll find that out anyway
Just like before
Everything you say to me
(Takes me one step closer to the edge)
(And I'm about to break)
I need a little room to breathe
(Cause I'm one step closer to the edge)
(I'm about to break)
*/
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |