#include <bits/stdc++.h>
using namespace std;
set<int> unused;
int n, m, a, b, ans;
vector<int> gr;
vector<set<int> > graph;
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m;
  graph.resize(n);
  for (int i = 0; i < m; i++) {
    cin >> a >> b;
    graph[a - 1].insert(b - 1);
    graph[b - 1].insert(a - 1);
  }
  for (int i = 0; i < n; i++) {
    unused.insert(i);
  }
  while (!unused.empty()) {
    while (gr.size() > 0) {
      int c = gr[gr.size() - 1];
      gr.pop_back();
      vector<int> forkick;
      for (auto j : unused) {
        if (graph[c].count(j) == 0) {
          forkick.push_back(j);
          gr.push_back(j);
        }
      }
      for (auto j : forkick) {
        unused.erase(j);
      }
    }
    if (unused.empty()) {
      break;
    }
    gr.push_back(*unused.begin());
    ans++;
    unused.erase(*unused.begin());
  }
  cout << ans - 1;
  return 0;
}
