#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <set>
using namespace std;
const int inf = (1 << 31) - 10;
const int maxn = 10010;
struct Node{
// int id;
int s, area;
set<int> memb;
}node[maxn];
struct Fam{
int id, famNum;
double Savg, Aavg;
}fam[maxn];
int N;
int isId[maxn], used[maxn];
bool cmp(Fam f1, Fam f2){
if(f1.Aavg != f2.Aavg) return f1.Aavg > f2.Aavg;
return f1.id < f2.id;
}
int minId, famNum, Stotal, Atotal;
void dfs(int id){
used[id] = 1;
famNum++;
Stotal += node[id].s;
Atotal += node[id].area;
minId = min(minId, id);
set<int>::iterator it = node[id].memb.begin();
for(; it != node[id].memb.end(); it++){
if(!used[*it]) dfs(*it);
}
}
void solve(){
memset(used, 0, sizeof(used));
int num = 0;
for(int i = 0; i < 10000; i++){
if(isId[i] && !used[i]){
minId = inf; famNum = 0;
Stotal = 0; Atotal = 0;
dfs(i);
fam[num].id = minId;
fam[num].famNum = famNum;
fam[num].Savg = (double)Stotal/famNum;
fam[num].Aavg = (double)Atotal/famNum;
num++;
}
}
sort(fam, fam + num, cmp);
printf("%d\n", num);
for(int i = 0; i < num; i++){
printf("%04d %d %.3f %.3f\n", fam[i].id, fam[i].famNum,
fam[i].Savg, fam[i].Aavg);
}
}
int main() {
//freopen("1.txt", "r", stdin);
memset(isId, 0, sizeof(isId));
scanf("%d", &N);
int id, fid, mid, k, cid;
for(int i = 0; i < N; i++){
scanf("%d %d %d %d", &id, &fid, &mid, &k);
isId[id] = 1;
if(fid != -1){
isId[fid] = 1;
node[fid].memb.insert(id);
node[id].memb.insert(fid);
}
if(mid != -1){
isId[mid] = 1;
node[mid].memb.insert(id);
node[id].memb.insert(mid);
}
for(int j = 0; j < k; j++){
scanf("%d", &cid);
isId[cid] = 1;
node[id].memb.insert(cid);
node[cid].memb.insert(id);
}
scanf("%d %d", &node[id].s, &node[id].area);
}
solve();
return 0;
}