#include <bits/stdc++.h>
using namespace std;
int n, m;
int par[111111], ht[111111];
int mrg[2222222], po[2222222], up[2222222], dn[2222222];
vector<int> adj[111111];
vector<int> comp[2222222];
map<pair<int, int>, int> mp;
void merge(int x, int y) {
  if (x == y) return;
  if ((int)comp[x].size() < (int)comp[y].size()) {
    swap(x, y);
  }
  mrg[x] = mrg[y] + mrg[x];
  for (int u : comp[y]) {
    po[u] = x;
    comp[x].push_back(u);
  }
  comp[y].clear();
  if (ht[up[x]] > ht[up[y]]) up[x] = up[y];
  if (ht[dn[x]] < ht[dn[y]]) dn[x] = dn[y];
}
void ride(int st, int nd, int def) {
  int v = st;
  while (ht[v] > ht[nd]) {
    int edg = mp[make_pair(v, par[v])];
    int nxt = par[v];
    if (po[edg] != 0) {
      nxt = up[po[edg]];
      merge(def, po[edg]);
      def = po[edg];
    } else {
      po[edg] = def;
      comp[def].push_back(edg);
    }
    v = nxt;
  }
}
void dfs(int v, int pa) {
  par[v] = pa;
  ht[v] = ht[pa] + 1;
  for (auto u : adj[v]) {
    if (u == pa) continue;
    int edg = mp[make_pair(u, v)];
    if (ht[u] == 0) {
      dfs(u, v);
    } else if (ht[u] < ht[v]) {
      po[edg] = edg;
      dn[edg] = v;
      up[edg] = u;
      comp[edg].push_back(edg);
      mrg[edg] = 1;
      ride(v, u, edg);
    }
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1, q, w; i <= m; i++) {
    scanf("%d%d", &q, &w);
    adj[q].push_back(w);
    adj[w].push_back(q);
    mp[make_pair(q, w)] = mp[make_pair(w, q)] = i;
  }
  for (int v = 1; v <= n; v++) {
    if (ht[v] == 0) {
      dfs(v, 0);
    }
  }
  vector<int> res;
  for (int e = 1; e <= m; e++) {
    if (mrg[po[e]] == 1) {
      res.push_back(e);
    }
  }
  printf("%d\n", (int)res.size());
  for (auto rs : res) {
    printf("%d ", rs);
  }
  putchar('\n');
  return 0;
}
