#include <bits/stdc++.h>   using namespace std;   const int N = 10100, M = 1001000, oo = 1000000000;   int i, j, k, n, m, ch, Pn, Tn, En, x, y, fx, fy, rt, nm;   int h[N * 2], p[N * 2], g[N * 2], tmp[N * 2];   struct edge {     int s, n;   } E[N * 4];   struct edge2 {     int s, n, v;   };   struct tree {     int l, r;   } T[N * 4];   struct point {     int fa, sz, dp, sn, tp, fv;   } P[N * 2];   int min(const int &x, const int &y) {     if (x < y) return x;     return y;   }   struct network {     int i, j, k, S, T, En, ans;     int z[N * 5], c[N * 5], d[N * 5], h[N * 5];     edge2 E[M];     void add(int x, int y, int v) {       E[++En].s = y;       E[En].v = v;       E[En].n = h[x];       h[x] = En;       E[++En].s = x;       E[En].v = 0;       E[En].n = h[y];       h[y] = En;     }     bool bfs() {       for (i = 1; i <= T; i++) c[i] = 0;       c[S] = 1;       d[1] = S;       i = 0;       j = 1;       while (i < j) {         i++;         for (k = h[d[i]]; k; k = E[k].n)           if (E[k].v && !c[E[k].s]) {             c[E[k].s] = c[d[i]] + 1;             d[++j] = E[k].s;             if (E[k].s == T) return 1;           }       }       return c[T];     }     void bfs2() {       z[S] = 1;       d[1] = S;       i = 0;       j = 1;       while (i < j) {         i++;         for (k = h[d[i]]; k; k = E[k].n)           if (E[k].v && !z[E[k].s]) {             z[E[k].s] = 1;             d[++j] = E[k].s;           }       }     }     int dfs(int x, int y) {       if (x == T || !y) return y;       int k, t, Y = y;       for (k = h[x]; k; k = E[k].n)         if (E[k].v && c[x] + 1 == c[E[k].s]) {           t = dfs(E[k].s, min(y, E[k].v));           y -= t;           E[k].v -= t;           E[k ^ 1].v += t;           if (!y) return Y;         }       if (y == Y) c[x] = -1;       return Y - y;     }     int work() {       ans = 0;       while (bfs()) ans += dfs(S, oo);       bfs2();       return ans;     }   } Net;   void R(int &x) {     x = 0;     ch = getchar();     while (ch <  0  ||  9  < ch) ch = getchar();     while ( 0  <= ch && ch <=  9 ) x = x * 10 + ch -  0 , ch = getchar();   }   void dfs1(int x, int F) {     P[x].sz = 1;     P[x].dp = P[F].dp + 1;     P[x].fa = F;     for (int k = h[x]; k; k = E[k].n)       if (E[k].s != F) {         tmp[E[k].s] = (k + 1) / 2;         dfs1(E[k].s, x);         P[x].sz += P[E[k].s].sz;         if (P[E[k].s].sz > P[P[x].sn].sz) P[x].sn = E[k].s;       }   }   void dfs2(int x, int F, int tp) {     P[x].fv = ++Pn;     p[Pn] = x;     P[x].tp = tp;     if (P[x].sn) dfs2(P[x].sn, x, tp);     for (int k = h[x]; k; k = E[k].n)       if (E[k].s != F && E[k].s != P[x].sn) dfs2(E[k].s, x, E[k].s);   }   void T_build(int L, int R, int &k) {     k = ++Tn;     if (L == R) {       Net.add(m + k, Net.T, 1);       g[p[L]] = m + k;       return;     }     int mid = (L + R) >> 1;     T_build(L, mid, T[k].l);     T_build(mid + 1, R, T[k].r);     Net.add(m + k, m + T[k].l, oo);     Net.add(m + k, m + T[k].r, oo);   }   void T_add(int L, int R, int l, int r, int x, int k) {     if (L == l && R == r) {       Net.add(x, m + k, oo);       return;     }     int mid = (L + R) >> 1;     if (r <= mid)       T_add(L, mid, l, r, x, T[k].l);     else {       if (l > mid)         T_add(mid + 1, R, l, r, x, T[k].r);       else         T_add(L, mid, l, mid, x, T[k].l),             T_add(mid + 1, R, mid + 1, r, x, T[k].r);     }   }   void E_add(int x, int y) {     E[++En].s = y;     E[En].n = h[x];     h[x] = En;     E[++En].s = x;     E[En].n = h[y];     h[y] = En;   }   int main() {     R(n);     R(m);     Net.En = 1;     Net.S = m + 2 * n;     Net.T = Net.S + 1;     for (i = 1; i < n; i++) {       R(x);       R(y);       E_add(x, y);     }     dfs1(1, 0);     dfs2(1, 0, 1);     T_build(1, n, rt);     for (i = 1; i <= m; i++) {       Net.add(Net.S, i, 1);       R(x);       R(y);       fx = P[x].tp;       fy = P[y].tp;       while (fx != fy) {         if (P[fx].dp > P[fy].dp) {           T_add(1, n, P[fx].fv, P[x].fv, i, rt);           x = P[fx].fa;           fx = P[x].tp;         } else {           T_add(1, n, P[fy].fv, P[y].fv, i, rt);           y = P[fy].fa;           fy = P[y].tp;         }       }       if (x != y) {         if (P[x].dp < P[y].dp)           T_add(1, n, P[x].fv + 1, P[y].fv, i, rt);         else           T_add(1, n, P[y].fv + 1, P[x].fv, i, rt);       }     }     printf( %d n , Net.work());     nm = 0;     for (i = 1; i <= m; i++)       if (!Net.z[i]) nm++;     printf( %d  , nm);     for (i = 1; i <= m; i++)       if (!Net.z[i]) printf( %d  , i);     puts(  );     nm = 0;     for (i = 2; i <= n; i++)       if (Net.z[g[i]]) nm++;     printf( %d  , nm);     for (i = 2; i <= n; i++)       if (Net.z[g[i]]) printf( %d  , tmp[i]);     puts(  );   }