#include<iostream>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<string>
#include<cstring>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<bitset>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> i_i;

#define PI 3.141592653589793238462643383279
#define mod 1000000007LL
#define rep(i, n) for(i = 0;i < n;++i)
#define rep1(i, n) for(i = 1;i < n;++i)
#define per(i, n) for(i = n - 1;i > -1;--i)
#define int(x) int x; scanf("%d",&x)
#define int2(x, y) int x, y; scanf("%d%d",&x, &y)
#define int3(x, y, z) int x, y, z; scanf("%d%d%d",&x, &y, &z)
#define int4(v, x, y, z) int v, x, y, z; scanf("%d%d%d%d", &v, &x, &y, &z)
#define int5(v, w, x, y, z) int v, w, x, y, z; scanf("%d%d%d%d%d", &v, &w, &x, &y, &z)
#define ll2(x, y) ll x, y; cin >> x >> y;
#define scn(n, a) rep(i, n)cin >> a[i]
#define sc2n(n, a, b) rep(i, n)cin >> a[i] >> b[i]
#define pri(x) cout << (x) << "\n"
#define pri2(x, y) cout << (x) << " " << (y) << "\n"
#define pri3(x, y, z) cout << (x) << " " << (y) << " " << (z) << "\n"
#define pb push_back
#define mp make_pair
#define all(a) (a).begin(),(a).end()
#define kabe puts("---------------------------")
#define kara puts("")
#define debug(x) cout << " --- " << (x) << "\n"
#define debug2(x, y) cout << " --- " << (x) << " " << (y) << "\n"
#define debug3(x, y, z) cout << " --- " << (x) << " " << (y) << " " << (z) << "\n"
#define X first
#define Y second
#define eps 0.0001
#define prid(x) printf("%.15lf\n", x)

struct edge{ int to; };
vector<edge> G[100];

int v, e;
#define maxV 100
vector<edge> sccrG[maxV];
bool sccused[maxV] = {false};
int sccr[maxV], sccrhd;
int scctopo[maxV];

void sccdfs(int now){
  sccused[now] = true;
  for(int i = 0;i < G[now].size();++i)if(!sccused[G[now][i].to])sccdfs(G[now][i].to);
  sccr[sccrhd++] = now;
  return;
}
void sccrdfs(int now, int num){
  sccused[now] = true;
  scctopo[now] = num;
  for(int i = 0;i < sccrG[now].size();++i)if(!sccused[sccrG[now][i].to])sccrdfs(sccrG[now][i].to, num);
  return;
}
void scc(void){
  for(int i = 0;i < v;++i)for(int j = 0;j < G[i].size();++j)sccrG[G[i][j].to].push_back((edge){i});
  for(int i = 0;i < v;++i)sccused[i] = false;
  sccrhd = 0;
  for(int i = 0;i < v;++i)if(!sccused[i])sccdfs(i);

  int num = 0;
  for(int i = 0;i < v;++i)sccused[i] = false;
  for(;sccrhd--;)if(!sccused[sccr[sccrhd]])sccrdfs(sccr[sccrhd], num++);
  for(int i = 0;i < v;++i)sccrG[i].clear();
  return;
}

double p[100];
int ord[100] = {0};

signed main(void){
  int i, j;
  for(int testcase = 0;testcase >= 0;testcase++){
    int(n);
    if(!n)break;
    v = n;
    rep(i, n){
      int m;
      cin >> p[i] >> m;
      G[i].resize(m);
      rep(j, m){
        int(a); --a;
        G[i][j] = (edge){a};
      }
    }

    scc();

    double res = 1.0;
    rep(i, n)ord[i] = 0;
    rep(i, n)ord[scctopo[i]] = 1;
    rep(i, n)rep(j, G[i].size()){
      if(scctopo[G[i][j].to] != scctopo[i])
      ++ord[scctopo[G[i][j].to]];
    }

    rep(i, n)if(ord[i] == 1){
      double tmp = 1.0;
      rep(j, n)if(scctopo[j] == i)tmp *= p[j];
      res *= 1.0 - tmp;
    }

    prid(res);

    rep(i, n)G[i].clear();

//*/

//*/ break;
  }
  return 0;
}

Measured memory_bytes: 3376