Example

Input

3 3 1 2 4
1 2
2 3
3 1


Output

IMPOSSIBLE
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int can[50][50][101];
typedef pair<int, int> P;
vector<int> G[50];

void bfs(int s){
	queue<P> q;
	q.push({ s, 0 });
	can[s][0][0] = 1;
	while(q.size()){
		int v = q.front().first, d = q.front().second;
		q.pop();
		if(d >= 101) return;
		for(auto c : G[v]){
			if(!can[s][c][d + 1]){
				can[s][c][d + 1] = 1;
				q.push({ c, d + 1 });
			}
		}
	}
}

int N, M;
int a[3];
int dp[50];
const int INF = 1 << 25;

int main(){
	cin.tie(0);
	ios::sync_with_stdio(false);
#ifdef LOCAL
	std::ifstream in("in");
	std::cin.rdbuf(in.rdbuf());
#endif

	cin >> N >> M;
	for(int i = 0; i < 3; i++){
		cin >> a[i];
	}
	for(int i = 0; i < M; i++){
		int u, v;
		cin >> u >> v;
		u--, v--;
		G[u].push_back(v);
	}

	for(int i = 0; i < N; i++){
		bfs(i);
		dp[i] = INF;
	}
	dp[N - 1] = 0;

	bool update = true;
	while(update){
		update = false;
		for(int i = 0; i < N; i++){
			int maxd = 0;
			for(int j = 0; j < 3; j++){
				int d = a[j];
				int mind = 1e9;
				for(int k = 0; k < N; k++){
					// i -> k
					if(can[i][k][d]){
						mind = min(mind, dp[k] + 1);
					}
				}
				maxd = max(maxd, mind);
			}
			if(dp[i] > maxd){
				dp[i] = maxd;
				update = true;
			}
		}
	}

	int res = dp[0];
	if(res >= INF){
		cout << "IMPOSSIBLE" << endl;
	}
	else{
		cout << res << endl;
	}
}