#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;
}
