#include<bits/stdc++.h>
#define maxn 300005
#define maxm 300005
using namespace std;
int n,m,k,t;
struct node{
int to,w,nxt;
}edge[maxm];
int tot,head[maxm],dis[maxn],a[maxn],vis[maxn];
void add(int u,int v)
{
edge[++tot].to=v;
edge[tot].w=1;
edge[tot].nxt=head[u];
head[u]=tot;
}
bool dijkstra()
{
priority_queue<pair<int,int> ,vector<pair<int,int> >,greater<pair<int,int> > > q;
int mx=-200000;
dis[1]=0;
q.push(make_pair(0,1));
while(!q.empty())
{
int x=q.top().second;
q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=head[x];i;i=edge[i].nxt)
{
int k=edge[i].to;
if(dis[k]>dis[x]+1)
{
dis[k]=dis[x]+1;
q.push(make_pair(k,dis[k]));
}
else if(dis[k]==dis[x]+1)
mx=max(mx,++a[i]);
}
}
return mx<=k;
}
int main()
{
cin>>t;
while(t--)
{
tot=0;
memset(edge,0,sizeof edge);
memset(vis,0,sizeof vis);
memset(head,0,sizeof head);
memset(dis,0x3f,sizeof dis);
cin>>n>>m>>k;
for(int i=1,u,v;i<=m;i++)
{
cin>>u>>v;
add(u,v);
}
fill(a+1,a+m+1,1);
if(dijkstra())
{
cout<<"Yes"<<endl;
for(int i=1;i<=m;i++)
cout<<a[i]<<" ";
cout<<endl;
}
else
cout<<"No"<<endl;
}
return 0;
}
rt