#include <vector>
#include <bitset>
#include <map>
#include <queue>
#include <climits>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;

class Edge{
public:
	int to, cap, rev, num;
	Edge(){};
	Edge(int to0, int cap0, int num0){to = to0; cap = cap0; num = num0;}
	Edge(int to0, int cap0, int rev0, int num0){to = to0; cap = cap0; rev = rev0; num = num0;}
};

int main()
{
	static vector<vector<Edge> > edges;
	static vector<bool> used;

	class Func{
	public:
		static int dfs(int s, int t, int f){
			if(s == t)
				return f;
			used[s] = true;
			for(unsigned i=0; i<edges[s].size(); ++i){
				Edge& e = edges[s][i];
				if(!used[e.to] && e.cap > 0){
					int g = dfs(e.to, t, min(f, e.cap));
					if(g > 0){
						e.cap -= g;
						edges[e.to][e.rev].cap += g;
						return g;
					}
				}
			}
			return 0;
		}
	};

	int n, m;
	cin >> n >> m;

	edges.assign(n, vector<Edge>());
	for(int i=0; i<m; ++i){
		int a, b;
		cin >> a >> b;
		--a;
		--b;
		edges[a].push_back(Edge(b, 1, edges[b].size(), -1));
		edges[b].push_back(Edge(a, 1, edges[a].size()-1, i+1));
	}

	int s, t;
	cin >> s >> t;
	--s;
	--t;

	int flow = 0;
	for(;;){
		used.assign(n ,false);
		int f= Func::dfs(s, t, INT_MAX);
		if(f == 0)
			break;
		flow += f;
	}

	vector<int> a;
	for(int i=0; i<n; ++i){
		for(unsigned j=0; j<edges[i].size(); ++j){
			if(edges[i][j].num != -1 && edges[i][j].cap == 0)
				a.push_back(edges[i][j].num);
		}
	}
	int num = a.size();

	cout << flow << endl;
	cout << num << endl;
	for(int i=0; i<num; ++i)
		cout << a[i] << endl;

	return 0;
}