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;
map<pair<int, int>, int> idx;
void biconnected_components(vector<vector<int>> &graph) {
  int N = graph.size();
  vector<int> num(N), low(N), art(N), stk;
  vector<vector<pair<int, int>>> bcc;
  vector<set<int>> bccv;
  int bccnum = 0;
  vector<vector<int>> comps;
  stack<pair<int, int>> s;
  function<void(int, int, int &)> dfs = [&](int u, int p, int &t) {
    num[u] = low[u] = ++t;
    stk.push_back(u);
    for (int v : graph[u])
      if (v != p) {
        if (!num[v]) {
          s.emplace(v, u);
          dfs(v, u, t);
          low[u] = min(low[u], low[v]);
          if (low[v] >= num[u]) {
            art[u] = (num[u] > 1 || num[v] > 2);
            comps.push_back({u});
            while (comps.back().back() != v) {
              comps.back().push_back(stk.back()), stk.pop_back();
            }
            bcc.push_back(vector<pair<int, int>>());
            bccv.push_back(set<int>());
            while (1) {
              auto p = s.top();
              s.pop();
              bcc[bccnum].push_back(p);
              bccv[bccnum].insert(p.first);
              bccv[bccnum].insert(p.second);
              if (p.first == v && p.second == u) break;
            }
            ++bccnum;
          }
        } else if (num[v] < num[u]) {
          low[u] = min(low[u], num[v]);
          s.emplace(v, u);
        }
      }
  };
  int t;
  for (int i = 0; i < N; i++)
    if (!num[i]) dfs(i, -1, t = 0);
  set<int> res;
  for (int i = 0; i < bcc.size(); i++) {
    if (bcc[i].size() == bccv[i].size()) {
      for (auto &x : bcc[i]) res.insert(idx[x]);
    }
  }
  cout << res.size() << '\n';
  for (auto &x : res) cout << x + 1 << ' ';
  if (res.size()) cout << '\n';
}
vector<vector<int>> graph;
int main() {
  int N, M;
  scanf("%d %d", &N, &M);
  graph.assign(N, vector<int>());
  for (int i = 0; i < M; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    u--;
    v--;
    graph[u].push_back(v);
    graph[v].push_back(u);
    idx[pair<int, int>(u, v)] = i;
    idx[pair<int, int>(v, u)] = i;
  }
  biconnected_components(graph);
  return 0;
}
