#include <bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(),(x).end()
#define YES() printf("YES\n")
#define NO() printf("NO\n")
#define isYES(x) printf("%s\n",(x) ? "YES" : "NO")
#define Yes() printf("Yes\n")
#define No() printf("No\n")
#define isYes(x) printf("%s\n",(x) ? "Yes" : "No")
#define isIn(x,y,h,w) (x >= 0 && x < h && y >= 0 && y < w)

#define int long long
//using ll = long long;
using P = pair<int,int>;

ostream &operator<<(ostream &os,const P &p){ return os << "(" << p.first << "," << p.second << ")"; }

template<class T> T &chmin(T &a,const T &b){ return a = min(a,b); }
template<class T> T &chmax(T &a,const T &b){ return a = max(a,b); }
 
const int INF=1e+18;
const double EPS=1e-9;
const int MOD=1000000007;

const int dx[]={1,0,-1,0},dy[]={0,-1,0,1};

template<class T>
struct Edge{
	int from,to;
	T cost;
	Edge(int to,T cost) : to(to),cost(cost){}
	Edge(int from,int to,T cost) : from(from),to(to),cost(cost){}
	operator int() const noexcept { return to; }
};

template<class T>
using WeightedGraph = vector<vector<Edge<T>>>;
using Graph = vector<vector<int>>;
template<class T>
using Matrix = vector<vector<T>>;

template<class T>
struct SCC{
	T g;
	Graph G,rG,nG;
	vector<vector<int>> scc;
	vector<int> cmp,used,vs;

	int operator[](int i) const{ return cmp[i]; }
	
	SCC(T g) : g(g),G(g.size()),rG(g.size()),cmp(g.size(),-1),used(g.size()){
		for(int i = 0;i < g.size();i++){
			for(const auto &e : g[i]){
				G[i].push_back((int)e);
				rG[(int)e].push_back(i);
			}
		}
	}

	void dfs(int v){
		used[v] = true;
		for(int to : G[v]) if(!used[to]) dfs(to);
		vs.push_back(v);
	}

	void rdfs(int v,int cnt){
		scc[cnt].push_back(v);
		cmp[v] = cnt;
		for(int to : rG[v]) if(cmp[to] == -1) rdfs(to,cnt);
	}

	void build(){
		int n = g.size(),cnt = 0;
		for(int i = 0;i < n;i++) if(!used[i]) dfs(i);
		reverse(vs.begin(),vs.end());
		for(int v : vs){
			if(cmp[v] == -1){
				scc.emplace_back();
				rdfs(v,cnt++);
			}
		}
		nG.resize(cnt);
		for(int i = 0;i < n;i++){
			for(const auto &e : g[i]){
				int u = cmp[i],v = cmp[(int)e];
				if(u != v) nG[u].push_back(v);
			}
		}
		for(int i = 0;i < cnt;i++){
			sort(nG[i].begin(),nG[i].end());
			nG[i].erase(unique(nG[i].begin(),nG[i].end()),nG[i].end());
		}
	}
};

int n;

void solve(){
	Graph G(n);
	double p[110];
	for(int i = 0;i < n;i++){
		int m;
		cin >> p[i] >> m;
		for(int j = 0;j < m;j++){
			int a;
			cin >> a; a--;
			G[i].push_back(a);
		}
	}
	SCC<Graph> scc(G);
	scc.build();
	int in[110] = {};
	for(int i = 0;i < scc.nG.size();i++){
		for(int to : scc.nG[i]) in[to]++;
	}
	double ans = 1;
	for(int i = 0;i < scc.nG.size();i++){
		if(!in[i]){
			double tmp = 1;
			for(int v : scc.scc[i]) tmp *= p[v];
			ans *= 1.0 - tmp;
		}
	}
	printf("%.14lf\n",ans);
}

signed main(){
	while(cin >> n,n) solve();
}
