#include <bits/stdc++.h>
#include <iomanip>
using namespace std;
const int maxn = 1e5+10; // 表长
typedef long long ll;
const ll inf=1e18;
ll n,m,st,en;
ll dis[maxn];///距离数组
struct edge
{
ll v;
ll a;
ll b;
}; ///定义边
vector<edge>ed[maxn];
typedef pair<ll,ll>P;
void init()
{
for(ll i=0; i<=n; i++)
{
dis[i]=inf;
ed[i].clear();
}
}
int che(ll l,ll a,ll b)
{
ll zhi=1;
for(int i=1; i<=b; i++)zhi*=2ll;
zhi--;
ll p=a/l;
if(p>=zhi)return 0;
return 1;///走不通
}
void dij(ll st)
{
ll i,v;
priority_queue<P,vector<P>,greater<P> >q;
dis[st]=1;
q.push(P(1,st));
while(!q.empty())
{
P p=q.top();
q.pop();
v=p.second;
if(dis[v]<p.first)continue;
for(i=0; i<ed[v].size(); i++)
{
edge e=ed[v][i];
if(che(dis[v],e.a,e.b))continue;
if(dis[e.v]>dis[v]+e.a)
{
dis[e.v]=dis[v]+e.a;
q.push(P(dis[e.v],e.v));
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
int uu,vv;
ll aa;
ll bb;
while(t--)
{
scanf("%d%d",&n,&m);
init();
//cout<<dis[1]<<" "<<dis[2]<<" "<<dis[3]<<endl;
for(int i=1; i<=m; i++)
{
scanf("%d%d%lld%lld",&uu,&vv,&aa,&bb);
ed[uu].push_back(edge{vv,aa,bb});
}
dij(1);
ll ans;
if(dis[n]==inf)printf("-1\n");
else
{
ans=log2(dis[n]);
printf("%lld\n",ans);
}
}
}