#define __USE_MINGW_ANSI_STDIO 0
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
#define int ll
using VI = vector<int>;
using VVI = vector<VI>;
using PII = pair<int, int>;

#define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i)
#define REP(i, n) FOR(i, 0, n)
#define ALL(x) x.begin(), x.end()
#define PB push_back

const ll LLINF = (1LL<<60);
const int INF = (1LL<<30);
const int MOD = 1000000007;

template <typename T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template <typename T> T &chmax(T &a, const T &b) { return a = max(a, b); }
template <typename T> bool IN(T a, T b, T x) { return a<=x&&x<b; }
template<typename T> T ceil(T a, T b) { return a/b + !!(a%b); }
template<class S,class T>
ostream &operator <<(ostream& out,const pair<S,T>& a){
  out<<'('<<a.first<<','<<a.second<<')';
  return out;
}
template<class T>
ostream &operator <<(ostream& out,const vector<T>& a){
  out<<'[';
  REP(i, a.size()) {out<<a[i];if(i!=a.size()-1)out<<',';}
  out<<']';
  return out;
}

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

double p[105];
class SCC {
public:
  int V,K;    // 頂点数, scc後の頂点数
  VVI G;      // グラフの隣接リストの表現
  VVI rG;     // 辺の向きを逆にしたグラフ
  VVI DAG;    // scc後のグラフの隣接リストの表現
  VVI rDAG;   // scc後の辺の向きを逆にしたグラフ
  VI vs;      // 帰りがけ順の並び
  VI used;    // すでに調べたか
  VI cmp;     // 属する強連結成分のトポロジカル順
  VVI member; // scc後の同一ノードの集合
  vector<double> weight;  // i番目の連結成分が持つ情報
  // 初期化
  SCC() { V=K=-1; }
  SCC(int V_): V(V_) {
    G.assign(V_, VI());
    rG.assign(V_, VI());
    used.assign(V_, false);
    cmp.assign(V_, false);
    weight.assign(V_, 1);   // !!!
  }
  // 辺を追加
  void add_edge(int from,int to) {
    assert(from<V && to<V);
    G[from].push_back(to);
    rG[to].push_back(from);
  }
  // dfs
  void dfs(int v) {
    used[v]=true;
    for(int nx:G[v]) if(!used[nx]) dfs(nx);
    vs.push_back(v);
  }
  // 逆順dfs
  void rdfs(int v,int k) {
    used[v]=true;
    cmp[v]=k;
    weight[k] *= p[v];  // !!!
    for(int nx:rG[v]) if(!used[nx]) rdfs(nx,k);
  }
  // 2回dfsをする O(|V|+|E|)
  int scc() {
    // dfsする
    used.assign(V,0);
    vs.clear();
    for(int v=0;v<V;v++) if(!used[v]) dfs(v);
    // 逆順でdfs
    used.assign(V,0);
    int k=0;
    for(int i=vs.size()-1;i>=0;i--)if(!used[vs[i]]) rdfs(vs[i],k++);
    // i番目の連結成分の頂点、情報
    member.resize(k); weight.resize(k);
    for(int i=0;i<V;i++) member[cmp[i]].push_back(i);
    return K=k;
  }
  // O(ElogE)
  VVI getDAG() {
    assert(K>=0);
    VVI res(K);
    for(int from=0;from<V;from++) {
      for(int to:G[from]) if(cmp[from]!=cmp[to]) res[cmp[from]].push_back(cmp[to]);
    }
    for(int i=0;i<K;i++){
      sort(res[i].begin(),res[i].end());
      res[i].erase(unique(res[i].begin(),res[i].end()),res[i].end());
    }
    return res;
  }
};

signed main(void)
{
  cin.tie(0);
  ios::sync_with_stdio(false);

  while(true) {
    int n;
    cin >> n;
    if(!n) break;
    SCC scc(n);
    REP(i, n) {
      cin >> p[i];
      int m; cin >> m;
      REP(j, m) {
        int a; cin >> a; a--;
        scc.add_edge(i, a);
      }
    }

    scc.scc();
    VVI g = scc.getDAG();

    // cout << scc.weight << endl;
    // cout << g << endl;

    VI d(g.size(), 0);
    REP(i, g.size()) {
      for(auto &j: g[i]) {
        d[j]++;
      }
    }

    // cout << d << endl;

    double ans = 1;
    REP(i, g.size()) {
      if(d[i] == 0) {
        ans *= 1-scc.weight[i];
      }
    }
    cout << fixed << setprecision(9) << ans << endl;
  }

  return 0;
}



Measured memory_bytes: 3420