#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
template<typename T>
void minimize(T& a, const T& b) {
if (b < a) a = b;
}
int n, m;
bool adj_mat[18][18];
int dp[1 << 18]; // dp[mask] = Số clique ít nhất có thể có khi xét các đỉnh có trong mask
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
--u; --v;
adj_mat[u][v] = adj_mat[v][u] = 1;
}
for (int mask = 0; mask < (1 << n); mask++) dp[mask] = INF;
// Trường hợp các đỉnh có trong mask là 1 clique
for (int mask = 0; mask < (1 << n); mask++) {
bool clique = true;
for (int u = 0; u < n; u++) {
if (!(mask & (1 << u))) continue;
for (int v = 0; v < n; v++) {
if (!(mask & (1 << v))) continue;
if (v == u) continue;
clique &= (adj_mat[u][v]);
}
}
if (clique) dp[mask] = 1;
}
// Trường hợp các đỉnh có trong mask được chia thành những clique có kích thước nhỏ hơn
for (int mask = 0; mask < (1 << n); mask++) {
for (int submask = mask; submask > 0; submask = (submask - 1) & mask) {
minimize(dp[mask], dp[submask] + dp[mask ^ submask]);
}
} // O(3^n)
cout << dp[(1 << n) - 1] << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCBtaW5pbWl6ZShUJiBhLCBjb25zdCBUJiBiKSB7CglpZiAoYiA8IGEpIGEgPSBiOyAKfQoKaW50IG4sIG07IApib29sIGFkal9tYXRbMThdWzE4XTsgCgppbnQgZHBbMSA8PCAxOF07IC8vIGRwW21hc2tdID0gU+G7kSBjbGlxdWUgw610IG5o4bqldCBjw7MgdGjhu4MgY8OzIGtoaSB4w6l0IGPDoWMgxJHhu4luaCBjw7MgdHJvbmcgbWFzayAKCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAkKCWNpbiA+PiBuID4+IG07IAoJZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKCQlpbnQgdSwgdjsKCQljaW4gPj4gdSA+PiB2OyAKCQktLXU7IC0tdjsgCgkJYWRqX21hdFt1XVt2XSA9IGFkal9tYXRbdl1bdV0gPSAxOyAKCX0KCglmb3IgKGludCBtYXNrID0gMDsgbWFzayA8ICgxIDw8IG4pOyBtYXNrKyspIGRwW21hc2tdID0gSU5GOwoKCS8vIFRyxrDhu51uZyBo4bujcCBjw6FjIMSR4buJbmggY8OzIHRyb25nIG1hc2sgbMOgIDEgY2xpcXVlCglmb3IgKGludCBtYXNrID0gMDsgbWFzayA8ICgxIDw8IG4pOyBtYXNrKyspIHsKCQlib29sIGNsaXF1ZSA9IHRydWU7IAoJCWZvciAoaW50IHUgPSAwOyB1IDwgbjsgdSsrKSB7CgkJCWlmICghKG1hc2sgJiAoMSA8PCB1KSkpIGNvbnRpbnVlOyAKCQkJZm9yIChpbnQgdiA9IDA7IHYgPCBuOyB2KyspIHsKCQkJCWlmICghKG1hc2sgJiAoMSA8PCB2KSkpIGNvbnRpbnVlOwoJCQkJaWYgKHYgPT0gdSkgY29udGludWU7ICAKCQkJCWNsaXF1ZSAmPSAoYWRqX21hdFt1XVt2XSk7IAoJCQl9CgkJfQoJCWlmIChjbGlxdWUpIGRwW21hc2tdID0gMTsgCgl9CgoJLy8gVHLGsOG7nW5nIGjhu6NwIGPDoWMgxJHhu4luaCBjw7MgdHJvbmcgbWFzayDEkcaw4bujYyBjaGlhIHRow6BuaCBuaOG7r25nIGNsaXF1ZSBjw7Mga8OtY2ggdGjGsOG7m2Mgbmjhu48gaMahbgoJZm9yIChpbnQgbWFzayA9IDA7IG1hc2sgPCAoMSA8PCBuKTsgbWFzaysrKSB7CgkJZm9yIChpbnQgc3VibWFzayA9IG1hc2s7IHN1Ym1hc2sgPiAwOyBzdWJtYXNrID0gKHN1Ym1hc2sgLSAxKSAmIG1hc2spIHsKCQkJbWluaW1pemUoZHBbbWFza10sIGRwW3N1Ym1hc2tdICsgZHBbbWFzayBeIHN1Ym1hc2tdKTsgCgkJfQoJfSAvLyBPKDNebikKCgljb3V0IDw8IGRwWygxIDw8IG4pIC0gMV0gPDwgJ1xuJzsgCn0=