#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define all(a) (a).begin,(a).end()
#define vi vector<int>
#define pb push_back
#define INF 999999999

#define MAX_V 100
vector<int> G[MAX_V];
vector<int> rG[MAX_V];

vector<double> p;


void add_edge(int from, int to){
	G[from].push_back(to);
	rG[to].push_back(from);
}

void dfs(int v, bool used[MAX_V], vector<int> &vs){
	used[v] = true;
	rep(i, G[v].size()){
		if(!used[G[v][i]]) dfs(G[v][i], used, vs);
	}
	vs.push_back(v);
}

void rdfs(int v, int k, vector<int> &sccs, vector<int> &cmp, bool used[MAX_V], vector<double> &elm){
	used[v] = true;
	sccs.push_back(v);
	cmp[v] = k;
	elm[k] *= p[v];
	rep(i, rG[v].size()){
		if(!used[rG[v][i]]) rdfs(rG[v][i], k, sccs, cmp, used, elm);
	}
}

int scc(int V, vector< vector<int> > &each_scc, vector<int> &cmp, vector<double> &elm) {
	vector<int> vs;
	bool used[MAX_V];
	rep(i, MAX_V) used[i] = false;
	vs.clear();
	rep(v, V){
		if(!used[v]) dfs((int)v, used, vs);
	}
	rep(i, MAX_V) used[i] = false;
	int k=0;
	for(int i=(int)vs.size()-1; i >=0; i--){
		vector<int> sccs;
		if(!used[vs[i]]){
			rdfs(vs[i], k++, sccs, cmp, used, elm);
			each_scc.push_back(sccs);
		}
	}
	return k;
}

void getSccedGraph(vector<vector<int>> each_scc, vector<int> cmp, vector<int> newGraph[MAX_V]){
	rep(i, each_scc.size()){
		set<int> edges;
		rep(j, each_scc[i].size()){
			rep(k, G[each_scc[i][j]].size()){
				int to = G[each_scc[i][j]][k];
				if(cmp[to] != i) edges.insert(cmp[to]);
			}
		}
		for(auto &edge:edges) newGraph[i].pb(edge);
	}
}

int main(){
	int n;
	while(cin >> n&&n){
		rep(i,MAX_V){
			G[i].clear();
			rG[i].clear();
		}
		
		p.clear();
		p.resize(n);
		rep(i,n){
			cin >> p[i];
			int m;
			cin >> m;
			rep(j, m){
				int a;
				cin>>a;
				add_edge(i,a-1);
			}
		}
		vector<vector<int>> each_scc;
		vector<int> cmp(MAX_V);
		vector<double> elm(MAX_V,1.0);
		int k=scc(n,each_scc,cmp,elm);
		
		vector<int> newGraph[MAX_V];
		getSccedGraph(each_scc,cmp,newGraph);
		
		vector<int> nyuuji(MAX_V,0);
		rep(i,k){
			rep(j,newGraph[i].size()){
				nyuuji[newGraph[i][j]]++;
			}
		}
		double ans=1.0;
		rep(i,k){
			if(nyuuji[i]==0){
				if(elm[i]==1)continue;
				ans*=(1-elm[i]);
			}
		}
		printf("%.9lf\n",ans);
	}
}