#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; 
 
template<typename has_less>
using ordered_set =
tree<has_less,
    null_type,
    less_equal<has_less>,
    rb_tree_tag,
    tree_order_statistics_node_update>;
    
//    typedef tree<
//    int,
//    null_type,
//    less_equal<int>,
//    rb_tree_tag,
//    tree_order_statistics_node_update> ordered_set;
 
// find_by_order(k)  returns iterator to kth element starting from 0;
// order_of_key(k) returns count of elements strictly smaller than k;
 
# define ll long long int
#define M 1000000007
#define pb push_back
#define ss second
#define ff first
#define inf 1000000000000000

 
void __print(int x) {cerr << x;}
void __print(long x) {cerr << x;}
void __print(long long x) {cerr << x ;}
void __print(unsigned x) {cerr << x;}
void __print(unsigned long x) {cerr << x;}
void __print(unsigned long long x) {cerr << x;}
void __print(float x) {cerr << x;}
void __print(double x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << '\'' << x << '\'';}
void __print(const char *x) {cerr << '\"' << x << '\"';}
void __print(const string &x) {cerr << '\"' << x << '\"';}
void __print(bool x) {cerr << (x ? "true" : "false");}
 
template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#ifndef ONLINE_JUDGE
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
#define debug(x...)
#endif
 
 
                                                    //nestedcode

long long binpow(long long a, long long b, long long m) {
    a %= m;
    long long res = 1;
    while (b > 0) {
        if (b & 1)
            res = res * a % m;
        a = a * a % m;
        b >>= 1;
    }
    return res;
}



ll m[20][20];
ll dpp[1<<20];
map<ll,ll> gm;
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    ll n,m1,i,j,mask,a,b,fl,h,ans = 0,msk;
    cin>>n>>m1;
    for(i=0;i<m1;i++){
        cin>>a>>b;
        a--;
        b--;
        m[a][b] = 1;
        m[b][a] = 1;
    }
   
    for(mask=1;mask<(1<<n);mask++){
        dpp[mask] = inf;
        ll v = 0,d,sub,sub2;
        vector<ll> vec;
        for(j=0;j<n;j++){
            if((mask>>j) & 1){
                v += (1ll<<j);
                vec.pb(j);
            }
        }

        fl = 0;
        for(j=0;j<vec.size();j++){
            for(h=0;h<vec.size();h++){
                if(j == h)  continue;
                if(m[vec[h]][vec[j]] == 0){
                    fl = 1;
                    break;
                }
            }if(fl)  break;
            
        }
        if(fl == 0){
            dpp[v] = 1;
            continue;
        }


       for(int i = mask; i > 0; i = (i-1) & mask){
    	dpp[mask] = min(dpp[mask], dpp[i] + dpp[v ^ i]);
    }
        

    }
    cout<<dpp[(1<<n) - 1];
    
}

#include<bits/stdc++.h>
#define re register
using namespace std;
inline int read(){
	re int t=0;re char v=getchar();
	while(v<'0')v=getchar();
	while(v>='0')t=(t<<3)+(t<<1)+v-48,v=getchar();
	return t;
}
const int M=998244353;
inline void add(re int &x,re int y){(x+=y)>=M?x-=M:x;}
inline int ksm(re int x,re int y){
	re int s=1;
	while(y){
		if(y&1)s=1ll*s*x%M;
		x=1ll*x*x%M,y>>=1;
	}
	return s;
}
int n,m,f[21][5002],fac[5002],inv[5002],s;
inline int C(re int x,re int y){return 1ll*fac[x]*inv[y]%M*inv[x-y]%M;}
signed main(){
	n=read(),m=read();
	for(re int i=fac[0]=inv[0]=1;i<=n;++i)fac[i]=1ll*fac[i-1]*i%M,inv[i]=ksm(fac[i],M-2);
	f[0][m]=1;
	for(re int i=0;(1<<i)<=m;++i){
		s=i;
		for(re int j=0;j<=m;++j){
			if(j%(1<<i))continue;
			if(!f[i][j])continue;
			for(re int k=0;k*(1<<i)<=j&&k<=n;k+=2)add(f[i+1][j-k*(1<<i)],1ll*f[i][j]*C(n,k)%M);
		}
	}
	printf("%d",f[s+1][0]);
}
