#include<cstdio>
#include<vector>
#include<queue>
#include<set>
#include<vector>
#include<algorithm>
#define maxn 10100
using namespace std;
set<int> g[maxn];
double est[maxn], area[maxn];
bool visit[maxn], input[maxn];
struct node {
int firstone, pnum;
double avg_est, avg_area;
node(int a, int p, double b, double c) : firstone(a), pnum(p), avg_est(b), avg_area(c) {}
bool operator < (const node &a) const {
if (a.avg_area != avg_area) return avg_area > a.avg_area;
else return firstone < a.firstone;
}
};
void dfs(int now, int &pnum, double &totalest, double &totalarea) {
queue<int> q;
q.push(now);
visit[now] = true;
while(!q.empty()) {
int temp = q.front();
q.pop();
pnum++;
totalest += est[temp];
totalarea += area[temp];
for (set<int>::iterator it = g[temp].begin(); it != g[temp].end(); it++) {
int t = *it;
if (visit[t] == false) {
q.push(t);
visit[t] = true;
}
}
}
return;
}
int main() {
fill(visit, visit + maxn, false);
fill(input, input + maxn, false);
int N, a, b, childnum;
double estt, areat;
scanf("%d", &N);
while(N--) {
scanf("%d", &a);
input[a] = true;
for (int i = 0; i < 2; i++) {
scanf("%d", &b);
if (b != -1) {
g[a].insert(b);
g[b].insert(a);
input[b] = true;
}
}
scanf("%d", &childnum);
for (int i = 0; i < childnum; i++) {
scanf("%d", &b);
g[a].insert(b);
g[b].insert(a);
input[b] = true;
}
scanf("%lf %lf", &estt, &areat);
est[a] = estt;
area[a] = areat;
}
vector<node> out;
for (int i = 0; i < maxn; i++) {
if (input[i] == true && visit[i] == false) {
double totalest = 0;
double totalarea = 0;
int pnum = 0;
dfs(i, pnum, totalest, totalarea);
out.push_back(node(i, pnum, totalest / pnum, totalarea / pnum));
}
}
sort(out.begin(), out.end());
printf("%d\n", out.size());
for (int i = 0; i < out.size(); i++) {
printf("%04d %d %.3f %.3f\n", out[i].firstone, out[i].pnum, out[i].avg_est, out[i].avg_area);
}
return 0;
}