Problem:
Score : 2200 points

Problem Statement

You are given a tree T with N vertices and an undirected graph G with N vertices and M edges.
The vertices of each graph are numbered 1 to N.
The i-th of the N-1 edges in T connects Vertex a_i and Vertex b_i, and the j-th of the M edges in G connects Vertex c_j and Vertex d_j.

Consider adding edges to G by repeatedly performing the following operation:

Choose three integers a, b and c such that G has an edge connecting Vertex a and b and an edge connecting Vertex b and c but not an edge connecting Vertex a and c. If there is a simple path in T that contains all three of Vertex a, b and c in some order, add an edge in G connecting Vertex a and c.

Print the number of edges in G when no more edge can be added.
It can be shown that this number does not depend on the choices made in the operation.

Constraints

2 \leq N \leq 2000

1 \leq M \leq 2000

1 \leq a_i, b_i \leq N

a_i \neq b_i

1 \leq c_j, d_j \leq N

c_j \neq d_j

G does not contain multiple edges.

T is a tree.

Input

Input is given from Standard Input in the following format:

N M
a_1 b_1
:
a_{N-1} b_{N-1}
c_1 d_1
:
c_M d_M

Output

Print the final number of edges in G.

Sample Input 1

5 3
1 2
1 3
3 4
1 5
5 4
2 5
1 5

Sample Output 1

6

We can have at most six edges in G by adding edges as follows:

Let (a,b,c)=(1,5,4) and add an edge connecting Vertex 1 and 4.

Let (a,b,c)=(1,5,2) and add an edge connecting Vertex 1 and 2.

Let (a,b,c)=(2,1,4) and add an edge connecting Vertex 2 and 4.

Sample Input 2

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

Sample Output 2

11

Sample Input 3

13 11
6 13
1 2
5 1
8 4
9 7
12 2
10 11
1 9
13 7
13 11
8 10
3 8
4 13
8 12
4 7
2 3
5 11
1 4
2 11
8 10
3 5
6 9
4 10

Sample Output 3

27

Solution in C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include<stdio.h>
int head[1024],last[262144],to[262144],cnt=0;
void add(int u,int v)
{
	cnt++;
	last[cnt]=head[u];
	head[u]=cnt;
	to[cnt]=v;
}
int tp[1024];
void dfs(int u,int t)
{
	if(tp[u]==t||tp[u]<0)
	{
		return;
	}
	if(!tp[u])
	{
		tp[u]=t;
	}
	else
	{
		tp[u]=-1;
	}
	for(int i=head[u];i;i=last[i])
	{
		dfs(to[i],t);
	}
}
int vis[1005][1005];
int a[262144],b[262144];
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=0;i<m;i++)
	{
		scanf("%d%d",&a[i],&b[i]);
		add(a[i],b[i]);
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			tp[j]=0;
		}
		tp[i]=-1;
		for(int j=head[i];j;j=last[j])
		{
			dfs(to[j],to[j]);
		}
		for(int j=1;j<=n;j++)
		{
			if(!tp[j])
			{
				vis[i][j]=0;
			}
			else if(tp[j]==j)
			{
				vis[i][j]=1;
			}
			else
			{
				vis[i][j]=2;
			}
		}
	}
	for(int i=0;i<m;i++)
	{
		if((vis[a[i]][b[i]]>=2)^(vis[b[i]][a[i]]>=1))
		{
			printf("diff\n");
		}
		else
		{
			printf("same\n");
		}
	}
	return 0;
}