2 0
 100000 0
 8 9
1 2
2 3
3 4
4 1
5 6
6 7
7 8
8 5
6 8
 2 1
1 2
 11 9
5 9
8 5
11 3
11 1
3 4
7 11
3 1
11 2
7 2
 7 9
7 3
7 4
1 2
2 3
3 1
3 4
4 5
5 6
6 4
 7 5
5 4
7 3
7 1
6 7
3 1
 7 8
1 2
2 3
3 4
4 1
3 5
5 6
6 7
7 3
 6 9
1 2
2 3
1 4
4 2
5 2
5 3
4 5
6 4
6 5
 7 9
1 2
2 4
4 3
3 1
2 3
4 5
5 6
6 7
7 4
 1 0
 6 7
1 2
2 3
3 1
3 4
4 5
5 6
6 4
 4 5
1 2
2 3
3 4
4 1
1 3
 100000 3
99998 99999
99999 100000
100000 99998

0

 0

 4
1 2 3 4 
 0

 6
3 4 6 7 8 9 
 9
1 2 3 4 5 6 7 8 9 
 3
2 3 5 
 8
1 2 3 4 5 6 7 8 
 0

 4
6 7 8 9 
 0

 6
1 2 3 5 6 7 
 0

 3
1 2 3 

#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x) {
  x = 0;
  T f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 1) + (x << 3) + ch - '0';
    ch = getchar();
  }
  x *= f;
}
struct edge {
  int u, v, next, id;
} e[100005 << 1];
int head[100005], k;
inline void add(int u, int v, int id) {
  e[k] = (edge){u, v, head[u], id};
  head[u] = k++;
}
int n, m;
int dep[100005], f[100005], fa[100005], fro[100005], ed[100005], ecnt;
int ans[100005];
bool vis[100005];
inline void dfs1(int u, int fath) {
  dep[u] = dep[fa[u] = fath] + 1;
  vis[u] = true;
  for (int i = head[u]; ~i; i = e[i].next) {
    int v = e[i].v;
    if (v == fath || dep[v] > dep[u]) continue;
    if (vis[v])
      --f[v], ++f[u], ed[++ecnt] = e[i].id;
    else
      dfs1(v, u), fro[v] = e[i].id;
  }
  vis[u] = false;
}
inline void dfs2(int u) {
  vis[u] = true;
  for (int i = head[u]; ~i; i = e[i].next) {
    int v = e[i].v;
    if (vis[v] || dep[v] != dep[u] + 1) continue;
    dfs2(v);
    f[u] += f[v];
  }
  vis[u] = false;
}
int main() {
  read(n), read(m);
  memset(head, -1, sizeof(head));
  for (int i = 1, u, v; i <= m; ++i) {
    read(u), read(v);
    add(u, v, i);
    add(v, u, i);
  }
  for (int i = 1; i <= n; ++i)
    if (!dep[i]) dfs1(i, 0);
  for (int i = 1; i <= n; ++i)
    if (dep[i] == 1) dfs2(i);
  for (int i = 1; i <= ecnt; ++i) {
    int id = (ed[i] - 1) << 1;
    int u = e[id].u, v = e[id].v;
    if (dep[u] < dep[v]) swap(u, v);
    int tmp = u;
    bool flag = false;
    for (; fa[tmp] != v; tmp = fa[tmp])
      if (f[tmp] != 1) {
        flag = true;
        break;
      }
    if (!flag && f[tmp] == 1) {
      ans[++ans[0]] = ed[i];
      while (u != v) {
        ans[++ans[0]] = fro[u];
        u = fa[u];
      }
    }
  }
  sort(ans + 1, ans + ans[0] + 1);
  printf("%d\n", ans[0]);
  for (int i = 1; i <= ans[0]; ++i) printf("%d ", ans[i]);
  return 0;
}
