#pragma comment(linker, "/STACK:102400000,102400000")
#include "iostream"
#include "cstring"
#include "algorithm"
#include "cmath"
#include "cstdio"
#include "sstream"
#include "queue"
#include "vector"
#include "string"
#include "stack"
#include "cstdlib"
#include "deque"
#include "fstream"
#include "map"
using namespace std;
typedef long long LL;
const int INF = 0x1fffffff;
const int MAXN = 1000000+100;
#define eps 1e-14
const int mod = 100000007;
int head[MAXN],vis[MAXN];
int cnt,n;
double dis,low[MAXN];
struct edge
{
int now;
int next;
double value;
}es[MAXN];
void addedge(int a,int b,int c)
{
es[cnt].now=b;
es[cnt].next=head[a];
es[cnt].value=0.01*c;
head[a]=cnt++;
}
double dij(int s,int t,int w)
{
for (int i=0;i<=n;i++)
{
low[i]=-1;
vis[i]=0;
}
low[s]=w*1.0;
for (int i=1;i<n;i++)
{
int pos=-1;
for (int i=1;i<=n;i++)
if (!vis[i]&&(pos==-1||low[i]>low[pos]))
pos=i;
if (pos==t) break;
vis[pos]=1;
for (int i=head[pos];i!=-1;i=es[i].next)
if(!vis[es[i].now]&&(low[es[i].now]<low[pos]*(1-es[i].value)))
low[es[i].now]=low[pos]*(1-es[i].value);
}
return low[t];
}
int main()
{
freopen("in","r",stdin);
while (scanf("%d",&n)!=EOF)
{
dis=-1;
cnt=1;
memset(head,-1,sizeof head);
for (int i=1;i<=n;i++)
{
int k;
scanf("%d",&k);
while (k--)
{
int b,c;
scanf("%d%d",&b,&c);
addedge(i,b,c);
}
}
int s,t,w;
scanf("%d%d%d",&s,&t,&w);
dis=dij(s,t,w);
if (dis<0) printf("IMPOSSIBLE!\n");
else printf("%0.2lf\n" , (1.0*w - dis) );
}
return 0;
}