#include<bits/stdc++.h>
using namespace std;
int t,v[1000005],a[1000005],m;
float d[100005],p[100005];
float n,l,vm;
struct pb{
float d,v,a;
}ia[100005];
bool cmp(const pb s1,const pb s2){
return s1.d>s2.d;
}
int main(){
ios::sync_with_stdio(false);
cin>>t;
while(t--){
memset(p,0,sizeof(p));
memset(d,0,sizeof(d));
memset(v,0,sizeof(v));
memset(a,0,sizeof(a));
memset(ia,0,sizeof(ia));
cin>>n>>m>>l>>vm;
int y=0,r=0,sum=0,mi=0,sp1=m;
for(int i=1;i<=n;i++){
int d1,a1,v1;
cin>>d1>>v1>>a1;
if(a1>=0){
d[r]=d1,v[r]=v1,a[r]=a1;
r++;
continue;
}
ia[y].d=d1,ia[y].v=v1,ia[y].a=a1;
y++;
}
for(int i=1;i<=m;i++)cin>>p[i];
for(int i=0;i<r;i++){
if(d[i]>p[m]) continue;
if(a[i]==0){
if(v[i]<=vm) continue;
sum++,mi=1;
continue;
}
float sx=sqrt(v[i]*v[i]+2*a[i]*(p[m]-d[i]));
if(sx<=vm) continue;
sum++,mi=1;
}
//大概思路:将加速度小于0的按照最靠北端进行排序,用sq1记录当前最远的一个公用的测速点,sq1默认为m,并找到最近的测速点;
sort(ia,ia+y,cmp);
for(int i=0;i<y;i++){
if(ia[i].d>p[m]) i++;
int u=lower_bound(p+1,p+m+1,ia[i].d)-p; //寻找到最近的测速点
float wu=ia[i].v*ia[i].v+2*ia[i].a*(p[u]-ia[i].d);
float wu2=ia[i].v*ia[i].v+2*ia[i].a*(p[sp1]-ia[i].d);//到达最远公用点是否超速
if(wu<0) continue;
float sx=sqrt(wu);
if(sx<=vm) continue;
sum++;
if(wu2<0){ //无法到达最远测速点需要另开一个,优先选取最近的一个测速点
mi++;
sp1=u;
continue;
}
float sx2=sqrt(wu2);
if(sx2<=vm){ //无法到达最远测速点需要另开一个,优先选取最近的一个测速点
mi++;
sp1=u;
}
}
cout<<sum<<' '<<m-mi<<endl;
}
return 0;
}