#include <iostream>
#include <vector>
#include <map>
using namespace std;
map<int, int> getColor;
string RES = "YES";
class Fonar {
public:
int num;
int color = 0;
bool visited = false;
vector<Fonar*> sosedi;
void add(Fonar *sosed)
{
sosedi.push_back(sosed);
}
};
void onecolor(Fonar *ff) {
Fonar f = *ff;
if (!f.visited & RES != "NO")
for (auto & i: f.sosedi) {
if ((*i).color == f.color) {
RES = "NO";
}
(*i).color = getColor[f.color];
(*i).visited = true;
onecolor(i);
}
}
void coloring(map<int, Fonar> *fonarii) {
map<int, Fonar> fonari = *fonarii;
for (int j = 1; j <= fonari.size(); j++) {
cout << fonari[j].color << " " << endl;
if (fonari[j].color == 0) fonari[j].color = 1;
onecolor(&fonari[j]);
}
}
int main() {
getColor[1] = 2;
getColor[2] = 1;
int test;
cin >> test;
while(test--) {
int n, m;
cin >> n >> m;
map<int, Fonar> fonari;
for (int i = 0; i < m; i++) {
int t, tt;
cin >> t >> tt;
if (fonari.count(t) == 0) {
Fonar tmp;
tmp.num = t;
fonari[t] = tmp;
}
if (fonari.count(tt) == 0) {
Fonar ttmp;
ttmp.num = tt;
fonari[tt] = ttmp;
}
fonari[t].add(&fonari[tt]);
fonari[tt].add(&fonari[t]);
}
fonari[1].color = 1;
coloring(&fonari);
cout << RES << endl;
RES = "YES";
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWFwPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCm1hcDxpbnQsIGludD4gZ2V0Q29sb3I7CnN0cmluZyBSRVMgPSAiWUVTIjsKCQpjbGFzcyBGb25hciB7CglwdWJsaWM6CglpbnQgbnVtOwoJaW50IGNvbG9yID0gMDsKCWJvb2wgdmlzaXRlZCA9IGZhbHNlOwoJdmVjdG9yPEZvbmFyKj4gc29zZWRpOwogIAoJdm9pZCBhZGQoRm9uYXIgKnNvc2VkKQogICAgewogICAgICAgIHNvc2VkaS5wdXNoX2JhY2soc29zZWQpOwogICAgfQogICAgCn07Cgp2b2lkIG9uZWNvbG9yKEZvbmFyICpmZikgewoJRm9uYXIgZiA9ICpmZjsKCWlmICghZi52aXNpdGVkICYgUkVTICE9ICJOTyIpCgkJZm9yIChhdXRvICYgaTogZi5zb3NlZGkpIHsKCQkJaWYgKCgqaSkuY29sb3IgPT0gZi5jb2xvcikgewoJCQkJUkVTID0gIk5PIjsKCQkJfQoJCQkKCQkJKCppKS5jb2xvciA9IGdldENvbG9yW2YuY29sb3JdOwoJCQkoKmkpLnZpc2l0ZWQgPSB0cnVlOwoJCQlvbmVjb2xvcihpKTsKCQl9CQp9Cgp2b2lkIGNvbG9yaW5nKG1hcDxpbnQsIEZvbmFyPiAqZm9uYXJpaSkgewoJbWFwPGludCwgRm9uYXI+IGZvbmFyaSA9ICpmb25hcmlpOwoJZm9yIChpbnQgaiA9IDE7IGogPD0gZm9uYXJpLnNpemUoKTsgaisrKSB7CgkJY291dCA8PCBmb25hcmlbal0uY29sb3IgPDwgIiAiIDw8IGVuZGw7CgkJaWYgKGZvbmFyaVtqXS5jb2xvciA9PSAwKSBmb25hcmlbal0uY29sb3IgPSAxOwoJCW9uZWNvbG9yKCZmb25hcmlbal0pOwoJfQp9CgppbnQgbWFpbigpIHsKCWdldENvbG9yWzFdID0gMjsgCglnZXRDb2xvclsyXSA9IDE7CglpbnQgdGVzdDsKCWNpbiA+PiB0ZXN0OwoJd2hpbGUodGVzdC0tKSB7CgkJaW50IG4sIG07CgkJY2luID4+IG4gPj4gbTsKCQltYXA8aW50LCBGb25hcj4gZm9uYXJpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CgkJCWludCB0LCB0dDsKCQkJY2luID4+IHQgPj4gdHQ7CgkJCWlmIChmb25hcmkuY291bnQodCkgPT0gMCkgewoJCQkJRm9uYXIgdG1wOwoJCQkJdG1wLm51bSA9IHQ7CgkJCQlmb25hcmlbdF0gPSB0bXA7CgkJCX0KCQkJaWYgKGZvbmFyaS5jb3VudCh0dCkgPT0gMCkgewoJCQkJRm9uYXIgdHRtcDsKCQkJCXR0bXAubnVtID0gdHQ7CgkJCQlmb25hcmlbdHRdID0gdHRtcDsKCQkJfQoJCQlmb25hcmlbdF0uYWRkKCZmb25hcmlbdHRdKTsKCQkJZm9uYXJpW3R0XS5hZGQoJmZvbmFyaVt0XSk7CgkJfQoJCQoJCWZvbmFyaVsxXS5jb2xvciA9IDE7CgkJY29sb3JpbmcoJmZvbmFyaSk7CgkJY291dCA8PCBSRVMgPDwgZW5kbDsKCQlSRVMgPSAiWUVTIjsKCX0KfQ==