#include <bits/stdc++.h>
using namespace std;
const int mx = 2e5 + 5;
inline int read() {
  int X = 0;
  bool flag = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') flag = 0;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    X = (X << 1) + (X << 3) + ch - '0';
    ch = getchar();
  }
  if (flag) return X;
  return ~(X - 1);
}
struct block {
  int u, v, idx;
};
int n, m;
int head[mx], nxt[mx], ver[mx], id[mx], tot;
int ans[mx], f[mx], g[mx];
int pos[mx], dep[mx];
int vis[mx], fa[mx], son[mx];
int topo[mx], cnt;
vector<block> query;
void add(int x, int y, int z) {
  ver[++tot] = y, id[tot] = z, nxt[tot] = head[x], head[x] = tot;
}
void tarjan(int x, int fath) {
  vis[x] = 1;
  for (int i = head[x]; i; i = nxt[i]) {
    int y = ver[i];
    if (y == fath) continue;
    if (!vis[y]) {
      fa[y] = x, son[x] = y, dep[y] = dep[x] + 1, pos[y] = id[i], tarjan(y, x);
    } else if (dep[y] < dep[x]) {
      query.push_back((block){x, y, id[i]});
      f[x]++, f[y]--;
    }
  }
  topo[++cnt] = x;
}
int main() {
  n = read(), m = read();
  for (int i = 1; i <= m; i++) {
    int x = read(), y = read();
    add(x, y, i), add(y, x, i);
  }
  for (int i = 1; i <= n; i++)
    if (!vis[i]) {
      cnt = 0, query.clear();
      tarjan(i, 0);
      for (int j = 1; j <= cnt; j++) {
        int x = topo[j];
        f[fa[x]] += f[x];
      }
      for (int j = 0; j < query.size(); j++) {
        int u = query[j].u, v = query[j].v, idx = query[j].idx, tmp = u;
        while (tmp != v && f[tmp] == 1) tmp = fa[tmp];
        if (tmp == v) g[u]++, g[v]--, ans[idx] = 1;
      }
      for (int j = 1; j <= cnt; j++) {
        int x = topo[j];
        g[fa[x]] += g[x];
      }
      for (int j = 1; j <= cnt; j++) {
        int x = topo[j];
        if (x == i) continue;
        if (g[x] == 1) ans[pos[x]] = 1;
      }
    }
  int res = 0;
  for (int i = 1; i <= m; i++)
    if (ans[i]) res++;
  printf("%d\n", res);
  for (int i = 1; i <= m; i++)
    if (ans[i]) printf("%d ", i);
}
