#include <bits/stdc++.h>
using namespace std;
const int md = 1e9 + 7;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n, m;
cin >> n >> m;
vector<vector<int>> leqs(n), geqs(n);
for (int i = 0, a, b; i < m; ++i) {
cin >> a >> b;
--a, --b;
if (a <= b) {
leqs[a].push_back(b);
} else {
geqs[b].push_back(a);
}
}
for (int i = 0; i < n; ++i) {
sort(leqs[i].begin(), leqs[i].end());
sort(geqs[i].begin(), geqs[i].end());
}
// dp[i][j][ch] = answer for i...n if s[i] = ch, j<=i, and s[j]=s[j+1]=...=s[i]
vector dp(n, vector(n, vector<int64_t>(26)));
for (int i = n - 1; i >= 0; --i) {
for (int j = 0; j <= i; ++j) {
for (int ch = 0; ch < 26; ++ch) {
if (i == n - 1) {
dp[i][j][ch] = 1;
continue;
}
int nchl = 0, nchr = 25;
for (int k = j; k <= i; ++k) {
// check conditions at k
auto it1 = upper_bound(leqs[k].begin(), leqs[k].end(), i);
if (it1 != leqs[k].end()) {
nchr = ch;
}
auto it2 = upper_bound(geqs[k].begin(), geqs[k].end(), i);
if (it2 != geqs[k].end()) {
nchl = ch;
}
}
for (int nch = nchl; nch <= nchr; ++nch) {
dp[i][j][ch] = (dp[i][j][ch] + dp[i + 1][ch == nch ? j : i + 1][nch]) % md;
}
}
}
}
int64_t ans = 0;
for (int ch = 0; ch < 26; ++ch) {
ans = (ans + dp[0][0][ch]) % md;
}
cout << ans << '\n';
}