Example

Input

3 3 1 2 4
1 2
2 3
3 1


Output

IMPOSSIBLE
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;
const int N=60;
bool mt[N][N],mr[5][N][N],gg[N][N],res[N][N],t[N];
int n,m,step[5],ans,v[N];
void mul(bool a[N][N],bool b[N][N])
{
    bool c[N][N],d[N][N];
    for(int i=1;i<=n;++i)
      for(int j=1;j<=n;++j) c[i][j]=a[i][j],d[i][j]=b[i][j],a[i][j]=0;
    for(int k=1;k<=n;++k)
      for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
          a[i][j]|=c[i][k]&d[k][j];
}
void mpow(int a)
{
    memset(res,0,sizeof(res));
    for(int i=1;i<=n;++i) res[i][i]=1;
    for(int i=1;i<=n;++i)
      for(int j=1;j<=n;++j)
        gg[i][j]=mt[i][j];
    for(;a;a>>=1,mul(gg,gg))
      if(a&1) mul(res,gg);
}
bool ok(int a,int b)
{
    for(int j=1;j<=n;++j)
      if(t[j]&&mr[b][a][j]) return 1;
    return 0;
}
int work()
{
    memset(t,0,sizeof(t)); t[n]=1;
    for(int i=1;i<n;++i)
    {
        int tot=0;
        for(int j=1;j<=n;++j)
          if(!t[j]&&ok(j,1)&&ok(j,2)&&ok(j,3))
          {
              if(j==1) return i;
              v[++tot]=j;
          }
        for(int j=1;j<=tot;++j) t[v[j]]=1;
    }
    return -1;
}
int main()
{
    while(scanf("%d%d%d%d%d",&n,&m,&step[1],&step[2],&step[3])!=EOF)
    {
        memset(mt,0,sizeof(mt));
        for(int i=1;i<=m;++i)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            mt[u][v]=1;
        }
        for(int i=1;i<=3;++i)
        {
            mpow(step[i]);
            for(int j=1;j<=n;++j)
              for(int k=1;k<=n;++k)
                mr[i][j][k]=res[j][k];
        }
        ans=work();
        if(ans>=0) printf("%d\n",ans);
        else printf("IMPOSSIBLE\n");
    }
    return 0;
}