#include <bits/stdc++.h>   using namespace std;   const int INF = 0x3f3f3f3f;   const long long LINF = 0x3f3f3f3f3f3f3f3f;   const int MOD = 1e9 + 7;   template <typename S, typename T>   inline bool Min(S &a, const T &b) {     return a > b ? a = b, true : false;   }   template <typename S, typename T>   inline bool Max(S &a, const T &b) {     return a < b ? a = b, true : false;   }   template <typename S, typename T>   inline void Adm(S &a, const T &b) {     a = (a + b) % MOD;     if (a < 0) a += MOD;   }   template <typename S, typename T>   inline void Mum(S &a, const T &b) {     a = 1LL * a * b % MOD;   }   template <typename T>   inline bool IsPri(T x) {     if (x < 2) return false;     for (T i = 2; i * i <= x; ++i)       if (x % i == 0) return false;     return true;   }   template <typename T>   inline T Gcd(T a, T b) {     while (b) {       T t = b;       b = a % b;       a = t;     }     return a;   }   template <typename T>   inline int BitCnt(T x) {     int cnt = 0;     while (x) ++cnt, x &= x - 1;     return cnt;   }   template <typename T>   inline T MDis(T x1, T y1, T x2, T y2) {     return abs(x1 - x2) + abs(y1 - y2);   }   template <typename T>   inline T MDis(T x1, T y1, T z1, T x2, T y2, T z2) {     return abs(x1 - x2) + abs(y1 - y2) + abs(z1 - z2);   }   inline double EDis(double x1, double y1, double x2, double y2) {     return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));   }   inline double EDis(double x1, double y1, double z1, double x2, double y2,                      double z2) {     return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) +                 (z1 - z2) * (z1 - z2));   }   inline long long Pow(long long a, long long n) {     long long t = 1;     a %= MOD;     while (n > 0) {       if (n & 1) t = t * a % MOD;       a = a * a % MOD, n >>= 1;     }     return t % MOD;   }   inline int read() {     static char buf[1000000], *p1 = buf, *p2 = buf;     register int x = false;     register char ch =         p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin), p1 == p2)             ? EOF             : *p1++;     ;     register bool sgn = false;     while (ch !=  -  && (ch <  0  || ch >  9 ))       ch = p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin), p1 == p2)                ? EOF                : *p1++;     ;     if (ch ==  - )       sgn = true,       ch = p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin), p1 == p2)                ? EOF                : *p1++;     ;     while (ch >=  0  && ch <=  9 )       x = (x << 1) + (x << 3) + (ch ^ 48),       ch = p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin), p1 == p2)                ? EOF                : *p1++;     ;     return sgn ? -x : x;   }   const int N = 1e3;   int n, m;   vector<int> dz;   vector<int> e[N];   int son(int x) {     int res = 0, y = x;     while (y <= n) {       res += min(x, n) - y + 1;       x = x << 1 | 1, y = y << 1;     }     return res;   }   long long ans;   int w[N];   void DFS1(int x, int fz) {     w[x] = son(dz[x]);     for (int y : e[x])       if (y != fz) {         w[x] -= son(dz[y]);         DFS1(y, x);       }   }   bool vis[N];   void DFS2(int x, int rt) {     vis[x] = 1;     Adm(ans, 1LL * w[rt] * w[x]);     for (int y : e[x])       if (!vis[y]) DFS2(y, rt);     vis[x] = 0;   }   int main() {     cin >> n >> m;     dz.push_back(1), dz.push_back(INT_MAX);     vector<pair<int, int> > edge;     for (int i = 0; i < m; ++i) {       int u, v;       scanf( %d%d , &u, &v);       edge.push_back({u, v});       while (u) dz.push_back(u), u >>= 1;       while (v) dz.push_back(v), v >>= 1;     }     (dz).push_back(INT_MIN), sort((dz).begin(), (dz).end()),         (dz).erase(unique((dz).begin(), (dz).end()), (dz).end());     for (int i = 1; i < ((int)(dz).size()) - 1; ++i) {       for (int j = dz[i] * 2; j <= dz[i] * 2 + 1; ++j)         if (dz[(lower_bound(dz.begin(), dz.end(), (j)) - dz.begin())] == j)           e[i].push_back((lower_bound(dz.begin(), dz.end(), (j)) - dz.begin())),               e[(lower_bound(dz.begin(), dz.end(), (j)) - dz.begin())].push_back(                   i);     }     DFS1(1, 0);     for (auto it : edge)       e[(lower_bound(dz.begin(), dz.end(), (it.first)) - dz.begin())].push_back(           (lower_bound(dz.begin(), dz.end(), (it.second)) - dz.begin())),           e[(lower_bound(dz.begin(), dz.end(), (it.second)) - dz.begin())]               .push_back(                   (lower_bound(dz.begin(), dz.end(), (it.first)) - dz.begin()));     for (int i = 1; i < ((int)(dz).size()) - 1; ++i) DFS2(i, i);     cout << ans << endl;     return 0;   }