/**
 *    author:  otera    
**/
#include<iostream>
#include<string> 
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<algorithm> 
#include<functional>
#include<iomanip>
#include<queue>
#include<deque>
#include<ciso646>
#include<random>
#include<map>
#include<set>
#include<complex>
#include<bitset>
#include<stack>
#include<unordered_map>
#include<utility>
#include<cassert>
using namespace std;

//#define int long long
typedef long long ll;
typedef unsigned long long ul;
typedef unsigned int ui;
typedef long double ld;
const int inf=1e9+7;
const ll INF=1LL<<60 ;
const ll mod=1e9+7 ;
#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define Rep(i,sta,n) for(int i=sta;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define per1(i,n) for(int i=n;i>=1;i--)
#define Rep1(i,sta,n) for(int i=sta;i<=n;i++)
typedef complex<ld> Point;
const ld eps = 1e-8;
const ld pi = acos(-1.0);
typedef pair<int, int> P;
typedef pair<ld, ld> LDP;
typedef pair<ll, ll> LP;
#define fr first
#define sc second
#define all(c) c.begin(),c.end()
#define pb push_back
#define debug(x)  cerr << #x << " = " << (x) << endl;
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }

// ll ans;
// int n;

// vector<vector<int>> combs[10];

// void dfs(int pos, int init, int l, vector<int> perm) { 
//     if(pos == l / 2)    {
//         //
//         combs[l].push_back(perm);
//         //
//     }
//     for(int i = init; i <= l - l / 2 + pos; ++ i) {
//         perm.push_back(i);
//         dfs(pos + 1, i + 1, l, perm);
//         perm.pop_back();
//     }
// }

// void rec(vector<vector<int>> f, int i) {
//     if(i == n) {
//         ++ ans;
//         return;
//     }
//     int cnt0 = 0, cnt1 = 0;
//     rep(j, n) {
//         if(i == j) continue;
//         if(f[i][j] == 1) ++ cnt1;
//         if(f[i][j] == 0) ++ cnt0;
//     }
//     if(cnt0 > n / 2 || cnt1 > n / 2) return;
//     int cnt = n - cnt0 - cnt1;
//     if(cnt == 1) {
//         rec(f, i + 1);
//     }
//     for(auto com: combs[cnt - 1]) {
//         int k = 0, l = 0;
//         vector<int> q;
//         rep(j, n) {
//             if(f[i][j] == 1 || f[i][j] == 0 || i == j) continue;
//             q.push_back(j);
//             if(com[l] == k) {
//                 ++ l;
//                 f[i][j] = 1;
//             } else {
//                 f[i][j] = 0;
//             }
//             ++ k;
//         }
//         rec(f, i + 1);
//         for(auto j: q) {
//             f[i][j] = -1;
//         }
//     }
// }

// void solve() {
//     vector<int> perm;
//     for(int i = 0; i <= 9; ++ i) {
//         combs[i].resize(0);
//         dfs(0, 0, i, perm);
//     }
//     while(cin >> n) {
//         int m; cin >> m;
//         vector<int> x(m), y(m);
//         vector<vector<int>> f(n, vector<int>(n, -1));
//         rep(i, m) {
//             cin >> x[i] >> y[i];
//             -- x[i], -- y[i];
//             f[x[i]][y[i]] = 1;
//             f[x[i]][y[i]] = 0;
//         }
//         ans = 0;
//         rec(f, 0);
//         cout << ans << endl;
//     }
// }

int n, m, f[9][9];
int ans;

bool check(int i) {
    int win = 0, lose = 0;
    rep(j, n) {
        if(i == j) continue;
        if(f[i][j] == 1) ++ win;
        else if(f[i][j] == 0) ++ lose;
    }
    return win <= n / 2 && lose <= n / 2;
}

void rec(int cnt) {
    if(cnt == n * n) {
        ++ ans;
        return;
    }
    int i = cnt / n, j = cnt % n;
    if(i == j || f[i][j] != -1) {
        if(check(i)) rec(cnt + 1);
        return;
    }
    f[i][j] = 1, f[j][i] = 0;
    if(check(i)) rec(cnt + 1);
    f[i][j] = 0, f[j][i] = 1;
    if(check(i)) rec(cnt + 1);
    f[i][j] = -1, f[j][i] = -1;
}

void solve() {
    while(cin >> n) {
        if(n == 0) break;
        cin >> m;
        rep(i, n) {
            rep(j, n) {
                f[i][j] = -1;
            }
        }
        rep(i, m) {
            int a, b; cin >> a >> b;
            -- a, -- b;
            f[a][b] = 1;
            f[b][a] = 0;
        }
        ans = 0;
        rec(0);
        cout << ans << endl;
    }
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	//cout << fixed << setprecision(10);
	//int t; cin >> t; rep(i, t)solve();
	solve();
    return 0;
}


Measured memory_bytes: 3172