#include <iostream>
using namespace std;
const int MAXV = 1000;
const int INF = 1000000000;
int n, G[MAXV][MAXV], res = INF, cun[MAXV][MAXV], cnt[MAXV] = {0};
bool vis[MAXV] = {false};
void DFS(int u, int depth)
{
if(depth >= res)
return;
if(u > n) {
res = depth;
return;
}
for(int i = 0; i < depth; i++) {
int len = cnt[i];
int c = 0;
for(int j = 0; j < len; j++) {
if(G[u][cun[i][j]] == INF)
c++;
}
if(c == len){
cun[i][cnt[i]++] = u;
DFS(u+1, depth);
cnt[i]--;
}
}
cun[depth][cnt[depth]++] = u;
DFS(u+1, depth+1);
cnt[depth]--;
}
int main()
{
int m, a, b;
cin >> n >> m;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
G[i][j] = G[j][i] = INF;
}
}
for(int i = 0; i < m; i++) {
cin >> a >> b;
G[a][b] = G[b][a] = 1;
}
DFS(1,0);
cout << res << endl;
return 0;
}