#include <bits/stdc++.h>
using namespace std;

struct edge {
    int to, cap, rev;
};

using edges = vector<edge>;
using graph = vector<edges>;

int dfs(graph& g, vector<bool>& used, int v, int t, int f) {
    if(v == t) {
        return f;
    }
    used[v] = true;
    for(int i=0; i<g[v].size(); ++i) {
        edge& e = g[v][i];
        if(!used[e.to] && e.cap > 0) {
            int d = dfs(g, used, e.to, t, min(f, e.cap));
            if(d > 0) {
                e.cap -= d;
                g[e.to][e.rev].cap = d;
                return d;
            }
        }
    }
    return 0;
}

int max_flow(graph& g, int s, int t) {
    int flow = 0;
    int INF = 1e9;
    vector<bool> used(g.size());
    while(true) {
        fill(used.begin(), used.end(), false);
        int f = dfs(g, used, s, t, INF);
        if(f == 0) {
            return flow;
        }
        flow += f;
    }
}

pair<int, int> add_edge(graph& g, int from, int to, int cap) {
    g[from].push_back(edge{to, cap, static_cast<int>(g[to].size())});
    g[to].push_back(edge{from, 0, static_cast<int>(g[from].size()-1)});
    return make_pair(from, (int)g[from].size()-1);
}

int main() {
    int N, M;
    cin >> N >> M;
    graph g(N);
    vector<pair<int, int>> idx(M);
    for(int i=0; i<M; ++i) {
        int x, y;
        cin >> x >> y;
        x--; y--;
        add_edge(g, x, y, 1);
        idx[i] = add_edge(g, y, x, 1);
    }
    int s, t;
    cin >> s >> t;
    s--; t--;
    int flow = max_flow(g, s, t);
    vector<int> res;
    for(int i=0; i<M; ++i) {
        if(g[idx[i].first][idx[i].second].cap == 0) {
            res.push_back(i+1);
        }
    }
    cout << flow << endl;
    cout << res.size() << endl;
    for(auto x : res) {
        cout << x << endl;
    }
}
