#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+7;
ll T;
ll sum[N];
ll n,m,len,xs;
struct Node
{
ll d,add,st;
ll l,r;
}a[N];
struct Qu
{
ll l,r;
}b[N];
bool cmp(Qu A,Qu B)
{
return A.l<B.l;
}
ll p[N];
ll ans1,ans2;
ll Q(ll l,ll r)
{
ll res=sum[r];
if(l!=0) res-=sum[l-1];
return res;
}
ll t[N],top;
void solve()
{
ans1=ans2=top=0;
for(ll i=1;i<=len;i++)
sum[i]=0;
scanf("%lld %lld %lld %lld",&n,&m,&len,&xs);
for(ll i=1;i<=n;i++)
{
scanf("%lld %lld %lld",&a[i].d,&a[i].st,&a[i].add);
if(a[i].add>0)
{
if(a[i].st>xs)
{
a[i].l=a[i].d;
a[i].r=len;
continue;
}
ll A=(xs*xs-a[i].st*a[i].st);
ll B=2*a[i].add;
ll di=A/B+1+a[i].d;
if(di>len) a[i].l=a[i].r=-1;
else a[i].l=di,a[i].r=len;
}
else if(a[i].add==0)
{
if(a[i].st>xs) a[i].l=a[i].d,a[i].r=len;
else a[i].l=a[i].r=-1;
}
else
{
if(a[i].st<=xs)
{
a[i].l=a[i].r=-1;
continue;
}
ll A=(xs*xs-a[i].st*a[i].st);
ll B=2*a[i].add;
ll di=A/B+a[i].d;
if(A%B==0) di--;
if(di>len)
{
a[i].l=a[i].d;
a[i].r=len;
}
else
{
a[i].l=a[i].d;
a[i].r=di;
}
}
}
for(ll i=1;i<=m;i++)
{
scanf("%lld",&p[i]);
sum[p[i]]++;
}
for(ll i=1;i<N;i++)
sum[i]+=sum[i-1];
for(ll i=1;i<=n;i++)
{
if(~a[i].l)
{
if(Q(a[i].l,a[i].r))
{
ll l=a[i].l,r=a[i].r;
ll id=0;
ans1++;
while(l<=r)
{
ll mid=(l+r)>>1;
if(Q(l,mid))
{
id=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
b[ans1].l=id;
l=a[i].l,r=a[i].r;
id=0;
while(l<=r)
{
ll mid=(l+r)>>1;
if(Q(mid,r))
{
id=mid;
l=mid+1;
}
else
{
r=mid-1;
}
}
b[ans1].r=id;
}
}
}
sort(b+1,b+1+ans1,cmp);
if(ans1)
{
ll Min=b[1].r;ans2=1;
for(ll i=2;i<=ans1;i++)
{
if(Min<b[i].l)
{
t[++top]=Min;
ans2++;
Min=b[i].r;
}
else
{
Min=min(Min,b[i].r);
}
}
}
printf("%lld %lld\n",ans1,m-ans2);
}
int main()
{
scanf("%lld",&T);
while(T--) solve();
}