#include <bits/stdc++.h>
using namespace std;
const int N = 2505;
int f[N][N][3], sz[N];
int dfn[N], low[N], T;
int fa[N], lp[N], n, m;
vector<int> E[N];
void update(int x, int y) {
  for (int i = (int)(0); i <= (int)(2); i++)
    for (int j = (int)(sz[x]); j >= (int)(0); j--) {
      int val = f[x][j][i];
      f[x][j][i] = -(1 << 29);
      for (int k = (int)(0); k <= (int)(2); k++)
        if (i + k != 3)
          for (int l = (int)(0); l <= (int)(sz[y]); l++)
            f[x][j + l][i] = max(f[x][j + l][i], val + f[y][l][k]);
    }
  sz[x] += sz[y];
}
int g[N][3];
void work(int x) {
  int Sz, st = lp[1];
  for (int i = (int)(0); i <= (int)(2); i++) {
    memset(g, 200, sizeof(g));
    ;
    Sz = sz[st];
    for (int j = (int)(0); j <= (int)(Sz); j++)
      for (int k = (int)(0); k <= (int)(2); k++)
        if (k + i != 3)
          g[j][k] = f[st][j][k];
        else
          g[j][k] = -(1 << 29);
    for (int j = (int)(2); j <= (int)(*lp); j++) {
      int x = lp[j], p[3];
      for (int v1 = (int)(Sz); v1 >= (int)(0); v1--) {
        for (int v2 = (int)(0); v2 <= (int)(2); v2++)
          p[v2] = g[v1][v2], g[v1][v2] = -(1 << 29);
        for (int v2 = (int)(0); v2 <= (int)(2); v2++)
          for (int v3 = (int)(0); v3 <= (int)(2); v3++)
            if (v2 + v3 != 3)
              for (int v4 = (int)(0); v4 <= (int)(sz[x]); v4++)
                g[v1 + v4][v3] = max(g[v1 + v4][v3], p[v2] + f[x][v4][v3]);
      }
      Sz += sz[x];
    }
    for (int v1 = (int)(sz[x]); v1 >= (int)(0); v1--) {
      int val = f[x][v1][i];
      f[x][v1][i] = -(1 << 29);
      for (int v2 = (int)(0); v2 <= (int)(2); v2++)
        if (v2 + i != 3)
          for (int v3 = (int)(0); v3 <= (int)(Sz); v3++)
            f[x][v1 + v3][i] = max(f[x][v1 + v3][i], val + g[v3][v2]);
    }
  }
  sz[x] += Sz;
}
void dfs(int x) {
  dfn[x] = low[x] = ++T;
  memset(f[x], 200, sizeof(f[x]));
  ;
  sz[x] = 1;
  f[x][0][0] = 0;
  f[x][1][1] = 0;
  f[x][0][2] = 1;
  for (int i = (int)(0); i <= (int)(E[x].size() - 1); i++) {
    int to = E[x][i];
    if (to == fa[x]) continue;
    if (dfn[to] == -1) {
      *lp = 0;
      for (int j = to; j != x; j = fa[j]) lp[++*lp] = j;
      work(x);
    } else if (!dfn[to]) {
      fa[to] = x;
      dfs(to);
      low[x] = min(low[x], low[to]);
      if (low[to] > dfn[x]) update(x, to);
    } else
      low[x] = min(low[x], dfn[to]);
  }
  dfn[x] = -1;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = (int)(1); i <= (int)(m); i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    E[x].push_back(y);
    E[y].push_back(x);
  }
  dfs(1);
  for (int i = (int)(0); i <= (int)(n); i++)
    printf("%d ", max(f[1][i][0], max(f[1][i][1], f[1][i][2])));
}
