Problem: There are n railway stations in Berland. They are connected to each other by n-1 railway sections. The railway network is connected, i.e. can be represented as an undirected tree.

You have a map of that network, so for each railway section you know which stations it connects.

Each of the n-1 sections has some integer value of the scenery beauty. However, these values are not marked on the map and you don't know them. All these values are from 1 to 10^6 inclusive.

You asked m passengers some questions: the j-th one told you three values:

  * his departure station a_j; 
  * his arrival station b_j; 
  * minimum scenery beauty along the path from a_j to b_j (the train is moving along the shortest path from a_j to b_j). 



You are planning to update the map and set some value f_i on each railway section — the scenery beauty. The passengers' answers should be consistent with these values.

Print any valid set of values f_1, f_2, ..., f_{n-1}, which the passengers' answer is consistent with or report that it doesn't exist.

Input

The first line contains a single integer n (2 ≤ n ≤ 5000) — the number of railway stations in Berland.

The next n-1 lines contain descriptions of the railway sections: the i-th section description is two integers x_i and y_i (1 ≤ x_i, y_i ≤ n, x_i ≠ y_i), where x_i and y_i are the indices of the stations which are connected by the i-th railway section. All the railway sections are bidirected. Each station can be reached from any other station by the railway.

The next line contains a single integer m (1 ≤ m ≤ 5000) — the number of passengers which were asked questions. Then m lines follow, the j-th line contains three integers a_j, b_j and g_j (1 ≤ a_j, b_j ≤ n; a_j ≠ b_j; 1 ≤ g_j ≤ 10^6) — the departure station, the arrival station and the minimum scenery beauty along his path.

Output

If there is no answer then print a single integer -1.

Otherwise, print n-1 integers f_1, f_2, ..., f_{n-1} (1 ≤ f_i ≤ 10^6), where f_i is some valid scenery beauty along the i-th railway section.

If there are multiple answers, you can print any of them.

Examples

Input


4
1 2
3 2
3 4
2
1 2 5
1 3 3


Output


5 3 5


Input


6
1 2
1 6
3 1
1 5
4 1
4
6 1 3
3 4 1
6 5 2
1 2 5


Output


5 3 1 2 1 


Input


6
1 2
1 6
3 1
1 5
4 1
4
6 1 1
3 4 3
6 5 3
1 2 4


Output


-1

Solution (in JAVA):

Solution:
import java.util.*;
import java.io.*;

public class Bestland{
    static int a,b,g,ans;
    static int[] A=new int[5005];
    static ArrayList<ArrayList<int[]>> e = new ArrayList<>(5005);
    static boolean change;
    static int[] parent=new int[5005];
    static int[] road=new int[5005];
    static int[] depth=new int[5005];
    public static void dfs(int id,int p,int d){
        parent[id]=p;
        depth[id]=d;
        for (int j = 0; j < e.get(id).size(); j++) {
            int[] i=e.get(id).get(j);
            int to=i[0];
            if(to!=p){road[to]=i[1];dfs(to,id,d+1);}
        }
    }
    public static void update(){
        while(depth[a]>depth[b]){
            if(A[road[a]]<=g){A[road[a]]=g;change=true;}
            a=parent[a];
        }
        while(depth[a]<depth[b]){
            if(A[road[b]]<=g){A[road[b]]=g;change=true;}
            b=parent[b];
        }
        while(a!=b){
            if(A[road[a]]<=g){A[road[a]]=g;change=true;}
            a=parent[a];
            if(A[road[b]]<=g){A[road[b]]=g;change=true;}
            b=parent[b];     
        }
    }
    public static void main(String[] args) throws IOException{
        Reader in = new Reader();
        int n = in.nextInt(); 
        for (int i = 0; i <= n; i++) {e.add(new ArrayList<>());A[i]=1;}    
        for (int i = 1; i < n; i++) {
            int a =in.nextInt();int b =in.nextInt();
            e.get(a).add(new int[] {b,i});
            e.get(b).add(new int[] {a,i});
        }
        dfs(1, -1, 0);
        int m=in.nextInt();
        int[][] constraints= new int[m][];
        for (int i = 0; i < m; i++) {
            a =in.nextInt();b =in.nextInt();g =in.nextInt();
            constraints[i]= new int[] {a,b,g};
        }
        Arrays.sort(constraints,(a, b) -> -Integer.compare(a[2], b[2]));
        for (int i = 0; i < m; i++) {          
            a=constraints[i][0];b=constraints[i][1];g=constraints[i][2];
            change=false;
            update();
            if(!change){System.out.println("-1");in.close();return;}
        }
        for (int i = 1; i < n; i++)System.out.print(A[i]+" ");
        in.close();
    }
    static class Reader { 
        final private int BUFFER_SIZE = 1 << 16; 
        private DataInputStream din; 
        private byte[] buffer; 
        private int bufferPointer, bytesRead; 
  
        public Reader() 
        { 
            din = new DataInputStream(System.in); 
            buffer = new byte[BUFFER_SIZE]; 
            bufferPointer = bytesRead = 0; 
        } 
  
        public Reader(String file_name) throws IOException 
        { 
            din = new DataInputStream(new FileInputStream(file_name)); 
            buffer = new byte[BUFFER_SIZE]; 
            bufferPointer = bytesRead = 0; 
        } 
  
        public String readLine() throws IOException 
        { 
            byte[] buf = new byte[64]; // line length 
            int cnt = 0, c; 
            while ((c = read()) != -1) 
            { 
                if (c == '\n') 
                    break; 
                buf[cnt++] = (byte) c; 
            } 
            return new String(buf, 0, cnt); 
        } 
  
        public int nextInt() throws IOException 
        { 
            int ret = 0; 
            byte c = read(); 
            while (c <= ' ') 
                c = read(); 
            boolean neg = (c == '-'); 
            if (neg) 
                c = read(); 
            do
            { 
                ret = ret * 10 + c - '0'; 
            }  while ((c = read()) >= '0' && c <= '9'); 
  
            if (neg) 
                return -ret; 
            return ret; 
        } 
  
        public long nextLong() throws IOException 
        { 
            long ret = 0; 
            byte c = read(); 
            while (c <= ' ') 
                c = read(); 
            boolean neg = (c == '-'); 
            if (neg) 
                c = read(); 
            do { 
                ret = ret * 10 + c - '0'; 
            } 
            while ((c = read()) >= '0' && c <= '9'); 
            if (neg) 
                return -ret; 
            return ret; 
        } 
  
        public double nextDouble() throws IOException 
        { 
            double ret = 0, div = 1; 
            byte c = read(); 
            while (c <= ' ') 
                c = read(); 
            boolean neg = (c == '-'); 
            if (neg) 
                c = read(); 
  
            do { 
                ret = ret * 10 + c - '0'; 
            } 
            while ((c = read()) >= '0' && c <= '9'); 
  
            if (c == '.') 
            { 
                while ((c = read()) >= '0' && c <= '9') 
                { 
                    ret += (c - '0') / (div *= 10); 
                } 
            } 
  
            if (neg) 
                return -ret; 
            return ret; 
        } 
  
        private void fillBuffer() throws IOException 
        { 
            bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE); 
            if (bytesRead == -1) 
                buffer[0] = -1; 
        } 
  
        private byte read() throws IOException 
        { 
            if (bufferPointer == bytesRead) 
                fillBuffer(); 
            return buffer[bufferPointer++]; 
        } 
  
        public void close() throws IOException 
        { 
            if (din == null) 
                return; 
            din.close(); 
        } 
    }
}