#include<bits/stdc++.h>

using namespace std;

#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define LC k<<1
#define RC k<<1|1

typedef long long LL;
const int N=310000;
const int M=1100000;
const LL mod=1e9+7;

int n,m;
vector<int> g[N];
vector<pair<int,int> >  h[N];
int dep[N],f[N][20];
struct edge
{
	int x,y;
}a[N];

int lca(int x,int y)
{
	if (dep[x]<dep[y]) swap(x,y);
	int tmp=dep[x]-dep[y];
	for (int i=19;i--;)
		if (tmp>>i&1)
			x=f[x][i];
	if (x==y) return x;
	for (int i=19;i--;)
		if (f[x][i]!=f[y][i])
			x=f[x][i],y=f[y][i];
	return f[x][0];
}
int find(int x,int dep)
{
	if (dep<0) return x;
	for (int i=19;i--;)
		if (dep>>i&1) x=f[x][i];
	return x;
}
void dfs(int x,int fa)
{
	dep[x]=dep[fa]+1;
	f[x][0]=fa;
	for (int i=1;i<20;i++)
		f[x][i]=f[f[x][i-1]][i-1];
	for (auto y:g[x])
		if (y!=fa) dfs(y,x);
}
LL ans;
int sz1[N],sz2[N];
void work(int x,int fa)
{
	for (auto y:g[x])
		if (y!=fa) work(y,x),sz1[x]+=sz1[y],sz2[x]+=sz2[y];
}
int tmp[N];
map<pair<int,int>,int > S;
map<pair<int,int>,int >::iterator it;
void dfs2(int x,int fa)
{
	ans+=(LL)h[x].size()*(LL)(sz1[x]-h[x].size());
	ans+=(LL)h[x].size()*(LL)(h[x].size()-1)/2;
	S.clear();
	for (auto p:h[x])
	{
		int fx=find(p.fi,dep[p.fi]-dep[x]-1);
		int fy=find(p.se,dep[p.se]-dep[x]-1);
		if (fx!=x) tmp[fx]++;
		if (fy!=x) tmp[fy]++;
		if (fx!=x&&fy!=x) S[mp(min(fx,fy),max(fx,fy))]++;
	}
	for (auto y:g[x])
		if (y!=fa)
		{
			ans-=(LL)tmp[y]*(LL)(sz2[y]-tmp[y]);
			ans-=(LL)tmp[y]*(LL)(tmp[y]-1)/2;
		}
	for (it=S.begin();it!=S.end();it++)
	{
		LL w=(*it).se;
		ans+=w*(w-1)/2;
	}
	for (auto y:g[x])
		if (y!=fa) dfs2(y,x);
	
}
int main()
{
	scanf("%d",&n);
	for (int i=1;i<n;i++)
	{
		int x,y;
		scanf("%d %d",&x,&y);
		g[x].pb(y);
		g[y].pb(x);
	}
	dfs(1,0);
	scanf("%d",&m);
	for (int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d %d",&x,&y);
		a[i]={x,y};
		h[lca(x,y)].pb(mp(x,y));
	}
	for (int i=1;i<=m;i++)
	{
		int tmp=lca(a[i].x,a[i].y);
		sz1[a[i].x]++,sz1[a[i].y]++;
		sz1[tmp]--,sz1[f[tmp][0]]--;
		
		sz2[a[i].x]++,sz2[a[i].y]++;
		sz2[tmp]--,sz2[tmp]--;
	}
	work(1,0);
	dfs2(1,0);
	cout<<ans<<endl;
	return 0;
}