//アルファベットということを忘れ数字とする
#include<bits/stdc++.h>
#define AMARI 1000000007
using namespace std;
long long n,r;
long long numbers[100005];
struct BIT{
  vector<long long> bit;
  BIT(long long n){
    bit.resize(n+1);
  }
  long long sum(long long i){
    long long sum=0;
    while(i>0){
      sum+=bit[i];
      i=i&(i-1);
    }
    return sum;
  }
  void add(long long i,long long x){
    while(i<=n){
      bit[i]+=x;
      i+=i&-i;
    }
  }
};
int main(){
  long long fact[100005]={0};
  fact[0]=1;
  for(int i=1;i<=100000;i++){
    fact[i]=fact[i-1]*i;
    fact[i]%=AMARI;
  }
  while(1){
    cin>>n;
    BIT b(n);
    if(n==0) break;
    cin>>r;
    for(int i=0;i<n;i++){
      numbers[i]=i+1;
    }
    for(int i=0;i<r;i++){
      long long s,t;
      cin>>s>>t;
      s--;
      t--;
      swap(numbers[s],numbers[t]);
    }
    long long ans=0;
    long long sum=0;
    for(int i=0;i<n;i++){
      sum=b.sum(numbers[n-1-i]);//n-1-iより後にnumbers[n-1-i]より小さい数字がある場合、その数字がn-1-iの位置に来ればそれは今の単語より順序が先の単語となる。その数字をn-i-1に置いた場合その後(n-i)の組み合わせはiの階乗分(i==0のときのみ1とする)あることになり、これを足す。
      ans+=fact[i]*sum;
      ans%=AMARI;
      b.add(numbers[n-1-i],1);//BITは1からiまでの合計を足す。sumでiを指定した際1からiまでの間にここでaddした値がある場合、それは今見ている数字より後に自分自身より小さい数字があるということになる。
    }
    cout<<ans<<endl;
  }
}