#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <algorithm>
using namespace std;
#define rep(i,j,k) for(int i=j;i<k;i++)
struct node{
int id,cnt;
double m,a;
};
int fa[10010];
int find(int x){
while(x != fa[x])
x = fa[x];
return x;
}
void uni(int a,int b){
int faa = find(a);
int fab = find(b);
if(faa < fab){
fa[fab]=faa;
}else if(faa>fab){
fa[faa]=fab;
}
}
bool cmp(node a,node b){
if(a.a!=b.a)
return a.a>b.a;
return a.id<b.id;
}
int main(){
int n,a,b,c,d,k,mt,at;
cin>>n;
map<int,node> mp;
set<int> st;
vector<node> ans;
rep(i,0,10000){
fa[i]=i;
}
rep(i,0,n){
cin>>a>>b>>c>>k;
st.insert(a);
if(b!=-1){
uni(b,a);
st.insert(b);
}
if(c!=-1){
uni(c,a);
st.insert(c);
}
rep(j,0,k){
cin>>d;
uni(d,a);
st.insert(d);
}
cin>>mt>>at;
node no={a,0,mt,at};
mp[a]=no;
}
for(set<int>::iterator it=st.begin();it!=st.end();it++){
int c = *it;
int f = find(c);
if(c!=f){
mp[f].m += mp[c].m;
mp[f].a +=mp[c].a;
mp[f].cnt++;
mp.erase(c);
}
}
printf("%d",mp.size());
for(map<int,node>::iterator it=mp.begin();it!=mp.end();it++){
it->second.cnt++;
it->second.id=it->first;
it->second.m/=it->second.cnt;
it->second.a/=it->second.cnt;
ans.push_back(it->second);
}
sort(ans.begin(),ans.end(),cmp);
rep(i,0,ans.size()){
printf("\n%04d %d %.3f %.3f",ans[i].id,ans[i].cnt,ans[i].m,ans[i].a);
}
return 0;
}