#include <iostream>
#include<algorithm>
#include<cstdio>
//1114
using namespace std;
int father[10000];//因爲是4位id
bool vis[10000];
struct Data{
int id;
int fid;
int mid;
int numS;
int area;
int cid[10];
}data[1005]; // 1000個人
struct node{
int id, numP;
double numS, area;
bool flag = false;
}ans[10000]; //四位id
void init(int n){
for(int i = 1;i<=n;i++){
father[i] = i;
}
}
int findFather(int x){
while(x!=father[x]){
x= father[x];
}
return x;
}
void Union(int a, int b){
int faA = findFather(a);
int faB = findFather(b);
if(faA > faB){ //實現題目要求家庭用最小id來標記
father[faA] = faB;
}else if(faA<faB){
father[faB] = faA;
}
}
bool cmp(node a, node b){
if(a.area != b.area)
return a.area > b.area;
else
return a.id<b.id;
}
int main()
{
freopen("1114.txt","r",stdin);
int n,k;
scanf("%d",&n);
// init(n);
//初始化
for(int i = 0; i < 10000;i++){
father[i]=i;
}
//輸入的同時 合併
for(int i = 0;i < n; i++){
scanf("%d %d %d %d",&data[i].id,&data[i].fid,&data[i].mid,&k);
vis[data[i].id] = 1;
if(data[i].fid != -1){
vis[data[i].fid] = 1;
Union(data[i].fid, data[i].id);
}
if(data[i].mid != -1){
vis[data[i].mid] = 1;
Union(data[i].id, data[i].mid);
}
for(int j = 0; j < k; j++){//
//粗心 將j++寫成k++ 導致段錯誤,死循環,運行超時
逐行debug
scanf("%d",&data[i].cid[j]);
vis[data[i].cid[j]] = 1;
Union(data[i].id, data[i].cid[j]);
}
scanf("%d %d", &data[i].numS,&data[i].area);
}
//對data遍歷
for(int i = 0 ; i < n; i++){
int id = findFather(data[i].id);
ans[id].id = id;
ans[id].area+=data[i].area;
ans[id].numS+=data[i].numS;
ans[id].flag = 1;
}
int numJT = 0;
for(int i = 0; i < 10000; i++){
if(vis[i])
ans[findFather(i)].numP++;
if(ans[i].flag)
numJT++;
}
for(int i = 0; i < 10000;i++){
if(ans[i].flag){
ans[i].numS = (double)(ans[i].numS *1.0 / ans[i].numP);
ans[i].area = (double)(ans[i].area *1.0 / ans[i].numP);
}
}
sort(ans,ans+ 10000,cmp);
printf("%d\n",numJT);
for(int i = 0 ; i < numJT; i++){
printf("%04d %d %.3f %.3f\n", ans[i].id, ans[i].numP, ans[i].numS, ans[i].area);
}
//cout << "Hello world!" << endl;
return 0;
}