You have unweighted tree of n vertices. You have to assign a positive weight to each edge so that the following condition would hold:

  * For every two different leaves v_{1} and v_{2} of this tree, [bitwise XOR](https://en.wikipedia.org/wiki/Bitwise_operation#XOR) of weights of all edges on the simple path between v_{1} and v_{2} has to be equal to 0. 



Note that you can put very large positive integers (like 10^{(10^{10})}).

It's guaranteed that such assignment always exists under given constraints. Now let's define f as the number of distinct weights in assignment.

<image> In this example, assignment is valid, because bitwise XOR of all edge weights between every pair of leaves is 0. f value is 2 here, because there are 2 distinct edge weights(4 and 5).

<image> In this example, assignment is invalid, because bitwise XOR of all edge weights between vertex 1 and vertex 6 (3, 4, 5, 4) is not 0. 

What are the minimum and the maximum possible values of f for the given tree? Find and print both.

Input

The first line contains integer n (3 ≤ n ≤ 10^{5}) — the number of vertices in given tree.

The i-th of the next n-1 lines contains two integers a_{i} and b_{i} (1 ≤ a_{i} < b_{i} ≤ n) — it means there is an edge between a_{i} and b_{i}. It is guaranteed that given graph forms tree of n vertices.

Output

Print two integers — the minimum and maximum possible value of f can be made from valid assignment of given tree. Note that it's always possible to make an assignment under given constraints.

Examples

Input


6
1 3
2 3
3 4
4 5
5 6


Output


1 4


Input


6
1 3
2 3
3 4
4 5
4 6


Output


3 3


Input


7
1 2
2 7
3 4
4 7
5 6
6 7


Output


1 6

Note

In the first example, possible assignments for each minimum and maximum are described in picture below. Of course, there are multiple possible assignments for each minimum and maximum. 

<image>

In the second example, possible assignments for each minimum and maximum are described in picture below. The f value of valid assignment of this tree is always 3. 

<image>

In the third example, possible assignments for each minimum and maximum are described in picture below. Of course, there are multiple possible assignments for each minimum and maximum. 

<image>
import java.util.*;
import java.io.*;

public class File {
    public static class FastScanner {
        BufferedReader br;
        StringTokenizer st;

        public FastScanner() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        String next() {
            while (st == null || !st.hasMoreElements()) {
                try {
                    st = new StringTokenizer(br.readLine());
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }

            return st.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(next());
        }

        long nextLong() {
            return Long.parseLong(next());
        }

        double nextDouble() {
            return Double.parseDouble(next());
        }
    }
	
    public static void main(String[] args) {
        FastScanner sc = new FastScanner();
        PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
		
		
		
		
		
		int n = sc.nextInt();
		int edges = n-1;
		
		
		
		// Initially assume that each edge is unique.
		
		// Getting min:
			// Depends on if there are paths with even length and odd length.
			// If any path length is odd, min is 2.
			// Otherwise, min is 1.
		// Getting max:
			// All leaves that are 2 away from each other must be same value.
			// Count how many paths of length 2.
		
		
		// For each leaf node, we increase the count for its parent.
		// Nodes with more than 1 leaf node have 2 length paths through it.
		
		Map<Integer, List<Integer>> graph = new HashMap<>();
		for (int i = 1; i <= n; i++) {
			graph.put(i, new ArrayList<Integer>());
		}
		
		for (int i = 0; i < n-1; i++) {
			int a = sc.nextInt();
			int b = sc.nextInt();
			
			graph.get(a).add(b);
			graph.get(b).add(a);
		}
		
		
		
		List<Integer> leaves = new ArrayList<Integer>();
		for (int i = 1; i <= n; i++) {
			if (graph.get(i).size() == 1) {
				leaves.add(i);
			}
		}
				
		// How many leaves attached to this node.
		Map<Integer, Integer> leafCount = new HashMap<>();
		for (int leaf : leaves) {
			int parent = graph.get(leaf).get(0);
			leafCount.put(parent, leafCount.getOrDefault(parent, 0) + 1);
		}
		
		// Paths of even length and odd length counts. Used to get min result.
		int[] oddCounts = new int[] {0};
		int min = 1;
		int max = n-1;
		
		DFS(leaves.get(0), -1, graph, 0, oddCounts);
		
		if (oddCounts[0] > 0) {
			if (leafCount.size() > 1) {
				min = 3;
			}
			else {
				min = 2;
			}			
		}
		
		for (int parent : leafCount.keySet()) {
			if (leafCount.get(parent) > 1) {
				max -= (leafCount.get(parent)-1);
			}
		}
		
		
		out.println(min + " " + max);
		
		
		
		out.close();
	}
	
	public static void DFS(int node, int prev, Map<Integer, List<Integer>> graph, int edges, int[] oddCounts) {
		boolean isLeaf = true;
		
		for (int next : graph.get(node)) {
			if (next == prev) continue;
			
			isLeaf = false;
			DFS(next, node, graph, edges + 1, oddCounts);
		}
		
		if (isLeaf) {
			if (edges % 2 == 1) {
				oddCounts[0]++;
			}
		}
	}
}
