#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int N=1e4+5; const double eps=1e-9; int T,n; int deg[N]; double A[N],B[N],C[N]; double k[N],e[N]; int head[N],num_edge; struct Edge { int v,nxt; }edge[N<<1]; inline void add_edge(int u,int v) { edge[++num_edge].v=v; edge[num_edge].nxt=head[u]; head[u]=num_edge; } bool dfs(int u,int fa) { double m=deg[u]; A[u]=k[u]; B[u]=(1-k[u]-e[u])/m; C[u]=1-k[u]-e[u]; double tmp=1,ratio=B[u]; for(int i=head[u],v;i;i=edge[i].nxt) { v=edge[i].v; if(v==fa) continue; if(!dfs(v,u)) return false; tmp-=ratio*B[v]; A[u]+=ratio*A[v]; C[u]+=ratio*C[v]; } if(fabs(tmp)<=eps) return false; A[u]/=tmp; B[u]/=tmp; C[u]/=tmp; return true; } int taskid; int main() { scanf("%d",&T); while(T--) { memset(deg,0,sizeof(deg)); memset(head,0,sizeof(head)); num_edge=0; scanf("%d",&n); for(int i=1,a,b;i<n;++i) { scanf("%d%d",&a,&b); ++deg[a],++deg[b]; add_edge(a,b); add_edge(b,a); } for(int i=1;i<=n;++i) { scanf("%lf%lf",k+i,e+i); k[i]/=100,e[i]/=100; } cout<<"Case "<<++taskid<<": "; if(dfs(1,1)&&fabs(1-A[1])>eps) cout<<C[1]/(1-A[1])<<'\n'; else puts("impossible"); } return 0; }