1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=3e5+10,INF=1e9+10;
4 int first[N],nex[N<<1],to[N<<1],edge[N<<1],tot;
5 void add(int a,int b,int c){
6 to[++tot]=b,nex[tot]=first[a],first[a]=tot,edge[tot]=c;
7 }
8 pair<int ,int> min(pair<int ,int> a,pair<int ,int > b){
9 return a<b?a:b;
10 }
11 pair<int ,int> add(pair<int,int> a,pair<int ,int> b){
12 return make_pair(a.first+b.first,a.second+b.second);
13 }
14 pair<int ,int> dp[N][2];//0 not up 1 up
15 void dfs(int x,int fa,int ed){
16 pair<int ,int > p,q;
17 p=make_pair(INF,INF);//up
18 q=make_pair(0,0);//not up
19 pair<int ,int> tmp1,tmp2;//p q;
20 for(int i=first[x];i;i=nex[i]){
21 int y=to[i];
22 if(y==fa) continue;
23 dfs(y,x,edge[i]);
24 tmp1=min(add(p,dp[y][0]),add(q,dp[y][1]));
25 tmp2=min(add(q,dp[y][0]),add(p,dp[y][1]));
26 p=make_pair(tmp1.first,tmp1.second);
27 q=make_pair(tmp2.first,tmp2.second);
28 }
29 if(ed==1||ed==2){//bi fan
30 dp[x][1]=min(make_pair(p.first,p.second+1),make_pair(q.first+1,q.second+1));
31 }else dp[x][1]=make_pair(INF,INF);
32 if(ed==0||ed==2){//bu fan
33 dp[x][0]=min(q,make_pair(p.first+1,p.second));
34 }else dp[x][0]=make_pair(INF,INF);
35 }
36
37 int main(){
38 int n;
39 scanf("%d",&n);
40 for(int i=1;i<n;++i){
41 int a,b,c,d;
42 scanf("%d%d%d%d",&a,&b,&c,&d);
43 int opt;
44 if(d==2) opt=2;
45 else if(c^d) opt=1;
46 else opt=0;
47 add(a,b,opt);
48 add(b,a,opt);
49 }
50 dfs(1,0,2);
51 printf("%d %d",dp[1][0].first>>1,dp[1][0].second);
52 }