#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct node{
int st,ed;
}t[N];
int T,n,m,L,v0,f[N],v[N],a[N],d[N],s[N],ans,x,ss,ans1;
bool cmp(node x,node y)
{
if(x.st==y.st)
return x.ed<y.ed;
return x.st<y.st;
}
void solve()
{
for(int i=1;i<=n;i++)
{
int minn=t[i].ed;
int j=i;
while(t[j].st<=t[i].ed&&t[j].st<=minn)
{
minn=min(minn,t[j].ed);
j++;
}
ans1++;
i=j;
}
}
signed main()
{
cin>>T;
while(T--)
{
ans=0;
ans1=0;
memset(t,0,sizeof(t));
memset(f,0,sizeof(f));
memset(s,0,sizeof(s));
cin>>n>>m>>L>>v0;
for(int i=1;i<=n;i++)
cin>>d[i]>>v[i]>>a[i];
for(int i=1;i<=m;i++)
{
cin>>x;
f[x]=1;
}
for(int i=1;i<=L;i++)
{
if(f[i])
s[i]=s[i-1]+1;
else
s[i]=s[i-1];
}
for(int i=1;i<=n;i++)
{
if(a[i]==0)
{
if(v[i]>v0&&s[L]-s[d[i]-1]>0)
{
t[i].st=d[i];
t[i].ed=L;
ans++;
}
continue;
}
else if(v[i]>v0&&a[i]>0)
{
if(s[L]-s[d[i]-1]>0)
{
t[i].st=d[i];
t[i].ed=L;
ans++;
continue;
}
}
else if(v[i]<=v0&&a[i]<=0)
continue;
else
{
bool flag=0;
if( (v0+v[i])*(v0-v[i])%(2*a[i])==0 )
flag=1,ss=(v0+v[i])*(v0-v[i])/(2*a[i]);
else
ss=(v0+v[i])*(v0-v[i])/(2*a[i])+1;
if(v[i]>v0&&a[i]<0)
{
int ed=min(L,d[i]+ss);
if(s[ed]-s[d[i]-1]>0)
{
t[i].st=d[i];
t[i].ed=ed;
ans++;
}
}
else if(v[i]<=v0&&a[i]>0)
{
if(flag)
ss++;
int ed=min(L,d[i]+ss);
if(s[ed]-s[d[i]-1]>0)
{
t[i].st=ed;
t[i].ed=L;
ans++;
}
}
}
}
sort(t+1,t+1+n,cmp);
solve();
cout<<ans<<" "<<m-ans1<<"\n";
}
return 0;
}