#include <cstdio>
#include <algorithm>
using namespace std;
const int N=1e5+1,L=1e6+1;
int t,n,m,l,vm,d,v,a,p[N],q[L],x[L],y[L];
struct CAR{
int s,t;
inline bool operator < (const CAR& c2){return t==c2.t?s<c2.s:t<c2.t;}
}car[N];
int main(){
register int i,j,ans2,sum,sum2,lst;
for (scanf ("%d",&t);t;--t){
scanf ("%d%d%d%d",&n,&m,&l,&vm);
sum=ans2=sum2=0;
for (i=1;i<=n;++i){
scanf ("%d%d%d",&d,&v,&a);
if (v<=vm&&v*v+2*(l-d)*a>vm*vm)car[++sum].s=int((vm*vm-v*v)/(2*a))+d+1,car[sum].t=l;
else if (v>vm){
car[++sum].s=d;
if (a>=0||v*v+2*(l-d)*a>vm*vm)car[sum].t=l;
else car[sum].t=int((vm*vm-v*v)/(2*a))+d;
}
}
for (i=1;i<=m;++i){
scanf ("%d",&p[i]);
for (j=p[i-1];j<p[i];++j)
q[j]=i-1;
}
for (j=p[m];j<=l;++j)
q[j]=m;
for (i=1;i<=sum;++i)
if (q[car[i].t]>q[car[i].s-1])
car[++sum2].s=q[car[i].s]+(q[car[i].s]==q[car[i].s-1]),car[sum2].t=q[car[i].t];
sort (car+1,car+sum2+1),lst=0;
for (i=1;i<=sum2;++i)
if (car[i].s>lst||car[i].t<lst)
++ans2,lst=car[i].t;
printf ("%d %d\n",sum2,m-ans2);
}
return 0;
}