Heidi has finally found the mythical Tree of Life – a legendary combinatorial structure which is said to contain a prophecy crucially needed to defeat the undead armies.

On the surface, the Tree of Life is just a regular undirected tree well-known from computer science. This means that it is a collection of n points (called vertices), some of which are connected using n - 1 line segments (edges) so that each pair of vertices is connected by a path (a sequence of one or more edges).

To decipher the prophecy, Heidi needs to perform a number of steps. The first is counting the number of lifelines in the tree – these are paths of length 2, i.e., consisting of two edges. Help her!

Input

The first line of the input contains a single integer n – the number of vertices in the tree (1 ≤ n ≤ 10000). The vertices are labeled with the numbers from 1 to n. Then n - 1 lines follow, each describing one edge using two space-separated numbers a b – the labels of the vertices connected by the edge (1 ≤ a < b ≤ n). It is guaranteed that the input represents a tree.

Output

Print one integer – the number of lifelines in the tree.

Examples

Input

4
1 2
1 3
1 4


Output

3

Input

5
1 2
2 3
3 4
3 5


Output

4

Note

In the second sample, there are four lifelines: paths between vertices 1 and 3, 2 and 4, 2 and 5, and 4 and 5.
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) {
		new F1().solve();
	}
}

class F1 {

	InputReader in = new InputReader(System.in);
	PrintWriter out = new PrintWriter(System.out);
	
	final int N = 10008 ;
    List<Integer>[] adj = new ArrayList[N] ;
    {
    	for(int i = 0 ; i < N ; i++) 
    		adj[i] = new ArrayList<Integer>() ;
    }  
    
	void solve() {
		 int n = in.nextInt() ;
		 
		 for(int i = 1 ; i <= n; i++) adj[i].clear() ;
		 
		 int u , v ;
		 for(int i = 1 ; i < n ; i++){
			 u = in.nextInt() ;
			 v = in.nextInt() ;
			 adj[u].add(v) ;
			 adj[v].add(u) ;
		 }
		 out.println(dfs(1 , -1)) ;
         out.flush() ;
	}
	
	long dfs(int u , int father){
	     long sum = 0 ;
	     long size = adj[u].size()  ;
	     if(u != 1) size-- ;
	     sum += size * (size - 1) / 2 ;
		 for(int v : adj[u]){
			 if(v == father) continue ;
			 sum += dfs(v , u) ;
			 sum += adj[v].size() - 1 ;
		 }
		 return sum  ;
	}
}


class InputReader {
	public BufferedReader reader;
	public StringTokenizer tokenizer;

	public InputReader(InputStream stream) {
		reader = new BufferedReader(new InputStreamReader(stream), 32768);
		tokenizer = new StringTokenizer("") ;
	}
	
	private void eat(String s){
		tokenizer = new StringTokenizer(s) ;
	}
	
	public String nextLine(){
		try {
			return reader.readLine() ;
		} catch (Exception e) {
			return null ;
		}
	}
	
	public boolean hasNext(){
		while(!tokenizer.hasMoreTokens()){
			String s = nextLine() ;
			if(s == null) return false ;
			eat(s) ;
		}
		return true ;
	}
	
	public String next() {
		hasNext() ;
		return tokenizer.nextToken();
	}

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

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

	public double nextDouble() {
		return Double.parseDouble(next());
	}

	public BigInteger nextBigInteger() {
		return new BigInteger(next());
	}

}
