//用了滚动数组;
//真正的方程式应该是dp[i][m][j]=max(dp[i-1][n][j],dp[i-1][m-1][j-time[i]]+val[i])
//dp[i][m][j]代表在前I个物品中取M个物品,价值不超过J;
#include<iostream>
using namespace std;
const int inf=99999999;
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int dp[105][1005];
int val[105];
int time[105];
int main()
{
int case1;
scanf("%d",&case1);
while(case1--)
{
int n,m,l;
scanf("%d%d%d",&n,&m,&l);
int i,j,k;
for(i=1;i<=n;i++)
{
scanf("%d%d",&time[i],&val[i]);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=l;j++)
{
if(i==0)
dp[i][j]=0;
else
dp[i][j]=-inf;
}
}
for(i=1;i<=n;i++)
{
for(j=m;j>=1;j--)
{
for(k=l;k>=time[i];k--)
{
dp[j][k]=max(dp[j][k],dp[j-1][k-time[i]]+val[i]);
}
}
}
if(dp[m][l]<0)
cout<<0<<endl;
else
cout<<dp[m][l]<<endl;
}
}