#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, m, ans, u, v;
set<int> Edge[N], s, t;
vector<int> will;
void dfs(int x) {
will.clear();
t.clear();
for (int i : s) {
if (!Edge[x].count(i))
will.push_back(i);
else
t.insert(i);
}
s = t;
for (int i : will) dfs(i);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i(1); i <= m; ++i) {
cin >> u >> v;
Edge[u].insert(v);
Edge[v].insert(u);
}
for (int i(1); i <= n; ++i) s.insert(i);
while (s.size()) {
++ans;
dfs(*s.begin());
}
cout << ans - 1;
return 0;
}