/*~Rainybunny~*/
#include <bits/stdc++.h>
#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
const int MAXN = 200, MOD = 998244353;
int n, m, f[MAXN * 2 + 5][MAXN * 2 + 5], fac[MAXN * 2 + 5], ifac[MAXN * 2 + 5];
bool good[MAXN * 2 + 5][MAXN * 2 + 5];
inline void subeq( int& a, const int b ) { ( a -= b ) < 0 && ( a += MOD ); }
inline int sub( int a, const int b ) { return ( a -= b ) < 0 ? a + MOD : a; }
inline int mul( const long long a, const int b ) { return int( a * b % MOD ); }
inline int add( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline void addeq( int& a, const int b ) { ( a += b ) >= MOD && ( a -= MOD ); }
inline int mpow( int a, int b ) {
int ret = 1;
for ( ; b; a = mul( a, a ), b >>= 1 ) ret = mul( ret, b & 1 ? a : 1 );
return ret;
}
inline void init() {
fac[0] = 1;
rep ( i, 1, n << 1 ) fac[i] = mul( i, fac[i - 1] );
ifac[n << 1] = mpow( fac[n << 1], MOD - 2 );
per ( i, ( n << 1 ) - 1, 0 ) ifac[i] = mul( ifac[i + 1], i + 1 );
}
inline int comb( const int a, const int b ) {
return a < b ? 0 : mul( fac[a], mul( ifac[b], ifac[a - b] ) );
}
int main() {
scanf( "%d %d", &n, &m ), init();
rep ( i, 1, m ) {
int u, v; scanf( "%d %d", &u, &v );
good[u][v] = good[v][u] = true;
}
rep ( i, 1, n << 1 | 1 ) f[i][i - 1] = 1;
rep ( len, 2, n << 1 ) if ( ~len & 1 ) {
for ( int l = 1, r; ( r = l + len - 1 ) <= n << 1; ++l ) {
rep ( i, l + 1, r ) if ( ( i - l ) & 1 ) {
if ( good[l][i] ) {
addeq( f[l][r], mul( mul( f[l + 1][i - 1], f[i + 1][r] ),
comb( r - l + 1 >> 1, r - i >> 1 ) ) );
}
}
}
}
printf( "%d\n", f[1][n << 1] );
return 0;
}