#include <bits/stdc++.h>
using namespace std;
const int maxn = 100007;
int n, m;
int ans;
int vis[maxn];
set<int> ed[maxn];
set<int> s;
queue<int> q;
void bfs(int u) {
  q.push(u);
  s.erase(u);
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    if (!vis[x]) {
      vis[x] = 1;
      set<int>::iterator it;
      for (it = s.begin(); it != s.end();) {
        int v = *it;
        it++;
        if (ed[x].find(v) == ed[x].end()) {
          q.push(v);
          s.erase(v);
        }
      }
    }
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    s.insert(i);
  }
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    ed[u].insert(v);
    ed[v].insert(u);
  }
  for (int i = 1; i <= n; i++) {
    if (!vis[i]) {
      bfs(i);
      ans++;
    }
  }
  printf("%d\n", ans - 1);
  return 0;
}
