#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int> P;
int INF = 3e18+7;
int mod = 1e9+7;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
struct UnionFind {
    vector<int> par, size;
    UnionFind(int x) {
        par.resize(x);
        size.resize(x, 1);
        for(int i = 0; i < x; i++) {
            par[i] = i;
        }
    }
    int find(int x) {
        if (par[x] == x)
            return x;
        return par[x] = find(par[x]);
    }
    bool same(int x, int y) {
        return find(x) == find(y);
    }
    int consize(int x) {
        return size[find(x)];
    }
    void unite(int x, int y) {
        x = find(x);
        y = find(y);
        if (x == y)
            return;
        if (size[x] < size[y]) {
            par[x] = y;
            size[y] += size[x];
        }
        else {
            par[y] = x;
            size[x] += size[y];
        }
    }
};
signed main() {
    int N;
    cin >> N;
    vector<vector<int>>ki(N);
    UnionFind uf(N);
    map<P,int>Mp;
    vector<int>ans;
    vector<int>cnt(N,INF);
    for(int i = 0; i < N; i++) {
        int a,b;
        cin >> a >> b;
        a--;b--;
        Mp[{a,b}] = i+1;
        if(uf.same(a,b)) {
            ans.push_back(i+1);
            queue<int>que;
            que.push(a);
            cnt[a] = 0;
            while (!que.empty()) {
                int x = que.front();
                que.pop();
                for(int i = 0; i < ki[x].size(); i++) {
                    if(cnt[ki[x][i]] == INF) {
                        cnt[ki[x][i]] = cnt[x]+1;
                        que.push(ki[x][i]);
                    }
                }
            }
            vector<int>road;
            road.push_back(b);
            que.push(b);
            while (!que.empty()) {
                int x = que.front();
                que.pop();
                for(int i = 0; i < ki[x].size(); i++) {
                    if(cnt[ki[x][i]] == cnt[x]-1) {
                        road.push_back(ki[x][i]);
                        que.push(ki[x][i]);
                    }
                }
            }
            for(int i = 0; i < road.size()-1; i++) {
                ans.push_back(max(Mp[{road[i],road[i+1]}],Mp[{road[i+1],road[i]}]));
            }
            break;
        }
        uf.unite(a,b);
        ki[a].push_back(b);
        ki[b].push_back(a);
    }
    cout << ans.size() << endl;
    for(int i = 0; i < ans.size(); i++) {
        cout << ans[i] << ((i+1 == ans.size())?"\n":" ");
    }
}