/*
Author: cnyz
世界があたしを拒んでも今 愛の唄 歌わせてくれないかな
*/
#include<bits/stdc++.h>
using namespace std;
using db=double;
using ll=long long;
using vi=vector<int>;
using pii=pair<int,int>;
using ull=unsigned long long;
#define fi first
#define se second
#define gc getchar
#define pb emplace_back
#define mkp make_pair
#define push emplace
#define sz(a) (int)a.size()
#define all(p) p.begin(),p.end()
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define ROF(i,a,b) for(int i=a;i>=b;i--)
#define ppc(x) __builtin_popcount(x)
#define clz(x) __builtin_clz(x)
bool Mbe;
void chkmax(int &x,int y) {if(x<y) x=y;}
void chkmin(int &x,int y) {if(x>y) x=y;}
void chkmax(ll &x,ll y) {if(x<y) x=y;}
void chkmin(ll &x,ll y) {if(x>y) x=y;}
int read() { int x; cin>>x; return x; }
const int N=2e5+5;
int n;
vi G[N],dag[N*40];
int dfn[N],dep[N],top[N],par[N],siz[N],dfc,deg[N*40];
int dn[18][N],up[18][N];
void dfs(int u,int fa) {
par[u]=fa,dep[u]=dep[fa]+1,siz[u]=1;
for(int &v:G[u]) if(v!=fa) {
dfs(v,u); siz[u]+=siz[v];
if(G[u][0]==fa||siz[G[u][0]]<siz[v]) swap(G[u][0],v);
}
}
void dfs2(int u,int tp) {
dfn[u]=++dfc,top[u]=tp;
for(int v:G[u]) if(v!=par[u]) {
if(v==G[u][0]) dfs2(v,tp);
else dfs2(v,v);
}
}
void getedge(int l,int r,int x,int t) {
if(l>r) return;
if(l<=dfn[x]&&dfn[x]<=r) {
getedge(l,dfn[x]-1,x,t),getedge(dfn[x]+1,r,x,t);
return;
}
else {
int k=__lg(r-l+1);
if(t==1) dag[x].pb(dn[k][l]),dag[x].pb(dn[k][r-(1<<k)+1]);
else dag[up[k][l]].pb(x),dag[up[k][r-(1<<k)+1]].pb(x);
}
}
void add(int a,int b,int c,int t) {
while(top[a]!=top[b]) {
if(dep[top[a]]>dep[top[b]]) swap(a,b);
getedge(dfn[top[b]],dfn[b],c,t);
b=par[top[b]];
}
if(dep[a]>dep[b]) swap(a,b);
getedge(dfn[a],dfn[b],c,t);
}
void solve() {
n=read(); int m=read();
FOR(i,1,n-1) {
int x=read(),y=read();
G[x].pb(y),G[y].pb(x);
}
dfs(1,0); dfs2(1,1);
FOR(i,1,n) dn[0][dfn[i]]=up[0][dfn[i]]=i;
int idc=n;
FOR(i,1,17) FOR(j,1,n-(1<<i)+1) {
dn[i][j]=++idc,up[i][j]=++idc;
// printf("%d %d dn %d up %d\n",i,j,idc-1,idc);
dag[dn[i][j]].pb(dn[i-1][j]);
dag[dn[i][j]].pb(dn[i-1][j+(1<<(i-1))]);
dag[up[i-1][j]].pb(up[i][j]);
dag[up[i-1][j+(1<<(i-1))]].pb(up[i][j]);
}
FOR(i,1,m) {
int typ=read(),a=read(),b=read(),c=read();
add(a,b,c,typ);
}
FOR(i,1,idc) for(int v:dag[i]) deg[v]++;
queue<int> q; vi o,oo;
FOR(i,1,idc) if(deg[i]==0) q.push(i);
while(sz(q)) {
int u=q.front(); q.pop();
if(u<=n) o.pb(u);
for(int v:dag[u]) {
deg[v]--;
if(!deg[v]) q.push(v);
}
}
if(sz(o)!=n) { cout<<-1<<'\n'; return; }
oo.resize(n+1);
FOR(i,0,n-1) oo[o[i]]=i+1;
FOR(i,1,n) cout<<oo[i]<<' ';
}
bool Med;
int main() {
ios::sync_with_stdio(false),cin.tie(0);
// fprintf(stderr, "%.3lf MB\n", (&Med - &Mbe) / 1048576.0);
int T=1;
while(T--) solve();
// fprintf(stderr, "%d ms\n", int(1e3 * clock() / CLOCKS_PER_SEC));
}