#include <iostream>
#include <set>
#include <cstring>
#include <algorithm>
using namespace std;
const int M = 10010;
int p[M], sz[M];
double Area[M], Sets[M];
bool st[M];
struct Res{
int id, num;
double ss, ar;
}res[M];
int find(int x){
if( p[x]!=x ) p[x]=find(p[x]);
return p[x];
}
void merge(int a, int b){
a=find(a), b=find(b);
if( a!=b ){
p[a] = b;
sz[b] += sz[a];
}
}
int main(){
for( int i=0; i<M; i++ ) p[i]=i, sz[i]=1;
int n;
scanf("%d", &n);
set<int> pp;
int id, mom, dad, k, kid;
double ss, ar;
while( n-- ){
scanf("%04d %04d %04d %d", &id, &mom, &dad, &k);
pp.insert(id);
if( mom!=-1 ) merge(id, mom), pp.insert(mom);
if( dad!=-1 ) merge(id, dad), pp.insert(dad);
while( k-- ) scanf("%04d", &kid), pp.insert(kid), merge(id, kid);
scanf("%lf %lf", &ss, &ar);
Sets[id]+=ss;
Area[id]+=ar;
}
int cnt = 0;
for( auto i: pp ){
int j = find(i);
if( !st[j] ){
st[j] = true;
for( auto t: pp ){
if( t!=j && find(t)==j ){
Sets[j] += Sets[t];
Area[j] += Area[t];
}
}
res[cnt++] = {i, sz[j], Sets[j]/(double)sz[j], Area[j]/(double)sz[j]};
}
}
sort(res, res+cnt, [](const auto& a, const auto& b){
if( a.ar!=b.ar ) return a.ar > b.ar;
return a.id < b.id;
});
printf("%d\n", cnt);
for( int i=0; i<cnt; i++ ){
printf("%04d %d %.3lf %.3lf\n", res[i].id, res[i].num, res[i].ss, res[i].ar);
}
return 0;
}