#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while (t--)
{
int n;
ll k;
cin >> n >> k;
unordered_map<int, ll> h;
for (int i = 1; i <= n; i++)
{
int a, b;
cin >> a >> b;
h[a] += b;
}
vector<ll> a;
for (auto &u : h)
a.push_back(u.second);
ll ans = 0, cnt = 0;
for (auto &u : a)
{
cnt += u / 3;
int tmp = min(2ll, u);
u -= tmp;
ans += tmp;
}
if (cnt < k)
{
cout << "-1\n";
continue;
}
k--; //状态保持在产生k-1组,且人员最多的情况
ans++; //临门一脚,符合题目“最少”
ll c1 = 0, c2 = 0, c3 = 0;;
for (auto u : a)
{
c3 += u / 3;
if (u % 3 == 2)
c2++;
else if (u % 3 == 1)
c1++;
}
//策略是先采取冗余最大的方案,符合题目“保证”(考虑最大冗余,才有底气保证)
ll v = min(k, c3);
k -= v;
ans += v * 3;
v = min(k, c2);
k -= v;
ans += v * 2;
v = min(k, c1);
k -= v;
ans += v;
cout << ans << '\n';
}
}