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;
int n, m, prt[100001][2] = {}, anc[100001], disc[100001] = {}, idx = 1;
vector<vector<pair<int, int> > > adj;
vector<int> ans;
stack<pair<pair<int, int>, int> > sk;
inline void stkout() {
  stack<pair<pair<int, int>, int> > tp = sk;
  cout << "Stack Size : " << tp.size() << "\n";
  while (tp.size()) {
    cout << tp.top().first.first << " " << tp.top().first.second << " "
         << tp.top().second << "\n";
    tp.pop();
  }
}
inline void ins(int u, int lw) {
  if (sk.size()) {
    if (sk.top().first.second < lw) {
      sk.push({{lw, anc[u]}, u});
    } else {
      while (sk.size()) {
        if (sk.top().first.first >= lw) {
          sk.pop();
        } else {
          break;
        }
      }
      if (sk.size() && sk.top().first.second >= lw) {
        lw = sk.top().first.first;
        sk.pop();
      }
      sk.push({{lw, anc[u]}, -1});
    }
  } else {
    sk.push({{lw, anc[u]}, u});
  }
}
inline void ansSet(int n, int u) {
  for (auto v : adj[u]) {
    if (v.first == n) {
      ans.push_back(v.second);
      break;
    }
  }
  while (u != n) {
    ans.push_back(prt[u][1]);
    u = prt[u][0];
  }
}
void dfs(int u, int p, int val) {
  if (!anc[u]) {
    anc[u] = idx;
    prt[u][0] = p;
    prt[u][1] = val;
    for (auto v : adj[u]) {
      if (!disc[v.second]) {
        anc[u] = disc[v.second] = idx++;
        dfs(v.first, u, v.second);
        if (anc[v.first] < anc[u]) {
          ins(u, anc[v.first]);
        }
        while (sk.size()) {
          if (sk.top().first.first >= anc[u]) {
            if (sk.top().second != -1) {
              ansSet(u, sk.top().second);
            }
            sk.pop();
          } else {
            break;
          }
        }
      }
    }
  }
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    adj.push_back(vector<pair<int, int> >());
  }
  for (int i = 1; i <= m; i++) {
    int a, b;
    cin >> a >> b;
    adj[a - 1].push_back({b - 1, i});
    adj[b - 1].push_back({a - 1, i});
  }
  for (int i = 0; i < n; i++) {
    dfs(i, -1, -1);
  }
  cout << ans.size() << "\n";
  sort(ans.begin(), ans.end());
  for (int i = 0; i < ans.size(); i++) {
    cout << ans[i];
    if (i < ans.size() - 1) {
      cout << " ";
    }
  }
  cout << "\n";
  return 0;
}
