#include <bits/stdc++.h>   using namespace std;   char buf[1 << 15], *fs, *ft;   inline char getc() {     return (fs == ft &&             (ft = (fs = buf) + fread(buf, 1, 1 << 15, stdin), fs == ft))                ? 0                : *fs++;   }   inline int read() {     int x = 0, f = 1;     char ch = getc();     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) f = -1;       ch = getc();     }     while (ch >=  0  && ch <=  9 ) {       x = x * 10 + ch -  0 ;       ch = getc();     }     return x * f;   }   const int MAXN = 40010;   int n, m;   int q[MAXN * 20], vis[MAXN * 20], mark[MAXN * 20];   int cnt, S, T, len, tot = 1, maxflow, t, h, st;   int f[MAXN][16], num[MAXN][16], Log[MAXN], d[MAXN];   int lin[MAXN], ver[MAXN << 1], nex[MAXN << 1], pos[MAXN << 1];   int lc[MAXN * 20], nc[MAXN * 20 << 2], vc[MAXN * 20 << 2], e[MAXN * 20 << 2];   int cur[MAXN * 20];   inline void add(int x, int y) {     ver[++len] = y;     nex[len] = lin[x];     lin[x] = len;   }   inline void adc(int x, int y, int z) {     vc[++tot] = y;     nc[tot] = lc[x];     lc[x] = tot;     e[tot] = z;     vc[++tot] = x;     nc[tot] = lc[y];     lc[y] = tot;     e[tot] = 0;   }   inline void dfs(int x, int father) {     d[x] = d[father] + 1;     for (int i = lin[x]; i; i = nex[i]) {       int tn = ver[i];       if (tn == father) continue;       f[tn][0] = x;       num[tn][0] = pos[i];       for (int j = 1; j <= Log[d[x]]; ++j) {         num[tn][j] = ++cnt;         f[tn][j] = f[f[tn][j - 1]][j - 1];         adc(num[tn][j], num[tn][j - 1], 1000000000);         adc(num[tn][j], num[f[tn][j - 1]][j - 1], 1000000000);       }       dfs(tn, x);     }   }   inline void LCA(int x, int y) {     if (d[x] < d[y]) swap(x, y);     for (int i = Log[d[x]]; i >= 0; --i)       if (d[f[x][i]] >= d[y]) {         adc(st, num[x][i], 1);         x = f[x][i];       }     if (x == y) return;     for (int i = Log[d[x]]; i >= 0; --i)       if (f[x][i] != f[y][i]) {         adc(st, num[x][i], 1);         adc(st, num[y][i], 1);         x = f[x][i];         y = f[y][i];       }     adc(st, num[x][0], 1);     adc(st, num[y][0], 1);     return;   }   inline int bfs() {     t = h = 0;     for (int i = 1; i <= cnt; ++i) {       cur[i] = lc[i];       vis[i] = 0;     }     q[++t] = S;     vis[S] = 1;     while (h++ < t) {       int x = q[h];       for (int i = lc[x]; i; i = nc[i]) {         int tn = vc[i];         if (vis[tn] || !e[i]) continue;         q[++t] = tn;         vis[tn] = vis[x] + 1;         if (tn == T) return 1;       }     }     return 0;   }   inline int dinic(int x, int flow) {     if (x == T) return flow;     int rest = flow, k;     for (int i = cur[x]; i && rest; i = nc[i]) {       cur[x] = i;       int tn = vc[i];       if (vis[tn] == vis[x] + 1 && e[i]) {         k = dinic(tn, min(e[i], rest));         if (!k) {           vis[tn] = 0;           continue;         }         e[i] -= k;         e[i ^ 1] += k;         rest -= k;       }     }     return flow - rest;   }   inline void bfs(int s) {     t = h = 0;     memset(vis, 0, sizeof(vis));     q[++t] = s;     while (h++ < t) {       int x = q[h];       vis[x] = 1;       for (int i = lc[x]; i; i = nc[i]) {         int tn = vc[i];         if (!e[i]) continue;         if (vis[tn]) continue;         q[++t] = tn;       }     }   }   int main() {     n = read();     m = read();     cnt = n - 1;     for (int i = 1; i < n; ++i) {       int x, y;       x = read();       y = read();       add(x, y);       add(y, x);       pos[len] = pos[len - 1] = i;       Log[i + 1] = Log[(i + 1) >> 1] + 1;     }     dfs(1, 0);     S = ++cnt;     T = ++cnt;     for (int i = 1; i < n; ++i) adc(i, T, 1);     for (int i = 1; i <= m; ++i) {       int x, y;       st = i + cnt;       x = read();       y = read();       adc(S, st, 1);       LCA(x, y);     }     int flow = 0;     st = cnt;     cnt = cnt + m;     while (bfs())       while ((flow = dinic(S, 1000000000))) maxflow += flow;     printf( %d n , maxflow);     bfs(S);     int count = 0;     for (int i = 1; i <= m; ++i)       if (!vis[st + i]) ++count;     printf( %d , count);     for (int i = 1; i <= m; ++i)       if (!vis[st + i]) printf(  %d , i);     puts(  );     count = 0;     for (int i = 1; i < n; ++i)       if (vis[i]) ++count;     printf( %d , count);     for (int i = 1; i < n; ++i)       if (vis[i]) printf(  %d , i);     return 0;   }