Example

Input

3 3 1 2 4
1 2
2 3
3 1


Output

IMPOSSIBLE
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
vector<int>g[3][110];
int G[110][110];
int dp[110][110];
//int bfs[8][110];
int bfs[1010];
int u[110];
int main(){
	int a,b,c,d,e;
	scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
	for(int i=0;i<b;i++){
		int p,q;scanf("%d%d",&p,&q);
		p--;q--;
		G[p][q]=1;
	}
	for(int i=0;i<a;i++){
		for(int j=0;j<110;j++)for(int k=0;k<a;k++)dp[j][k]=0;
		dp[0][i]=1;
		for(int j=0;j<c;j++){
			for(int k=0;k<a;k++){
				if(!dp[j][k])continue;
				for(int l=0;l<a;l++)if(G[k][l])dp[j+1][l]=1;
			}
		}
		for(int j=0;j<a;j++)if(dp[c][j])g[0][i].push_back(j);
	}
	for(int i=0;i<a;i++){
		for(int j=0;j<110;j++)for(int k=0;k<a;k++)dp[j][k]=0;
		dp[0][i]=1;
		for(int j=0;j<d;j++){
			for(int k=0;k<a;k++){
				if(!dp[j][k])continue;
				for(int l=0;l<a;l++)if(G[k][l])dp[j+1][l]=1;
			}
		}
		for(int j=0;j<a;j++)if(dp[d][j])g[1][i].push_back(j);
	}
	for(int i=0;i<a;i++){
		for(int j=0;j<110;j++)for(int k=0;k<a;k++)dp[j][k]=0;
		dp[0][i]=1;
		for(int j=0;j<e;j++){
			for(int k=0;k<a;k++){
				if(!dp[j][k])continue;
				for(int l=0;l<a;l++)if(G[k][l])dp[j+1][l]=1;
			}
		}
		for(int j=0;j<a;j++)if(dp[e][j])g[2][i].push_back(j);
	}
	for(int i=0;i<110;i++)bfs[i]=999999999;
	bfs[a-1]=0;
//	bfs[0][a-1]=bfs[1][a-1]=bfs[2][a-1]=0;

	for(int i=0;i<a;i++){
		for(int j=0;j<a;j++){
			int cost=0;
			for(int k=0;k<3;k++){
				int v=999999999;
				for(int l=0;l<g[k][j].size();l++){
					v=min(v,bfs[g[k][j][l]]);
				}
				cost=max(cost,v);
			}
			bfs[j]=min(bfs[j],cost+1);
		}
	}
	if(bfs[0]>9999999)printf("IMPOSSIBLE\n");
	else printf("%d\n",bfs[0]);
	
//	if(bfs[0][0]<0||bfs[1][0]<0||bfs[2][0]<0)printf("IMPOSSIBLE\n");
//	else printf("%d\n",max(bfs[0][0],max(bfs[1][0],bfs[2][0])));
}