#include <bits/stdc++.h>
const int N = 2e4 + 42, M = 1e6 + 61, LN = 16;
struct edge {
  int to, next, w;
} e[M << 1];
int head[M], cnt = 1, nc;
void addedge(int x, int y, int z) {
  if (!y) return;
  e[++cnt] = (edge){y, x[head], z}, x[head] = cnt;
  e[++cnt] = (edge){x, y[head], 0}, y[head] = cnt;
}
int fa[N][LN], pt[N][LN], dep[N], eid[N];
std::vector<std::pair<int, int> > g[N];
void dfs(int x, int p) {
  x[fa][0] = p, x[pt][0] = ++nc;
  addedge(nc, x, 1e9);
  for (int i = 1; i < LN; i++) {
    x[fa][i] = x[fa][i - 1][fa][i - 1], x[pt][i] = ++nc;
    addedge(nc, x[pt][i - 1], 1e9), addedge(nc, x[fa][i - 1][pt][i - 1], 1e9);
  }
  for (auto [nx, id] : x[g])
    if (nx != p) nx[eid] = id, nx[dep] = x[dep] + 1, dfs(nx, x);
}
int lca(int x, int y) {
  if (x[dep] < y[dep]) std::swap(x, y);
  for (int i = LN - 1; i >= 0; i--)
    if (x[fa][i][dep] >= y[dep]) x = x[fa][i];
  if (x == y) return x;
  for (int i = LN - 1; i >= 0; i--)
    if (x[fa][i] != y[fa][i]) x = x[fa][i], y = y[fa][i];
  return x[fa][0];
}
int get(int x, int k) {
  for (int i = 0; i < LN; i++)
    if ((k >> i) & 1) x = x[fa][i];
  return x;
}
void link(int p, int x, int y) {
  if (x == y) return;
  int sub = x[dep] - y[dep];
  int k = 31 - __builtin_clz(sub);
  addedge(p, x[pt][k], 1e9);
  addedge(p, get(x, sub - (1 << k))[pt][k], 1e9);
}
int lv[M], cur[M];
bool bfs(int s, int t) {
  memset(lv, 0, sizeof lv);
  std::queue<int> q;
  for (s[lv] = 1, q.push(s); !q.empty(); q.pop())
    for (int x = q.front(), i = x[cur] = x[head], nx; i; i = e[i].next)
      if (!(nx = e[i].to)[lv] && e[i].w) nx[lv] = x[lv] + 1, q.push(nx);
  return t[lv];
}
int dfs(int s, int t, int f) {
  if (s == t || !f) return f;
  int r = 0, tt;
  for (int &i = s[cur], nx; i; i = e[i].next)
    if ((nx = e[i].to)[lv] == s[lv] + 1 &&
        (tt = dfs(nx, t, std::min(f, (int)e[i].w)))) {
      e[i].w -= tt, e[i ^ 1].w += tt, r += tt, f -= tt;
      if (!f) return r;
    }
  if (f) s[lv] = 0;
  return r;
}
int dinic(int s, int t) {
  int r = 0;
  while (bfs(s, t)) r += dfs(s, t, 1e9);
  return r;
}
bool vis[M];
void dfs2(int x) {
  x[vis] = true;
  for (int i = x[head], nx; i; i = e[i].next)
    if (e[i].w && !(nx = e[i].to)[vis]) dfs2(nx);
}
std::vector<int> v1, v2;
int n, m, S, T, c_pt[N];
int main() {
  scanf("%d%d", &n, &m), nc = n;
  for (int i = 1, x, y; i < n; i++) {
    scanf("%d%d", &x, &y);
    x[g].push_back({y, i});
    y[g].push_back({x, i});
  }
  dep[1] = 1, dfs(1, 0);
  S = ++nc, T = ++nc;
  for (int i = 1; i <= n; i++) addedge(i, T, 1);
  for (int i = 1, x, y; i <= m; i++) {
    scanf("%d%d", &x, &y);
    int l = lca(x, y), p = ++nc;
    c_pt[i] = p;
    addedge(S, p, 1);
    link(p, x, l), link(p, y, l);
  }
  printf("%d\n", dinic(S, T));
  dfs2(S);
  for (int i = 1; i <= m; i++)
    if (!c_pt[i][vis]) v1.push_back(i);
  for (int i = 2; i <= n; i++)
    if (i[vis]) v2.push_back(eid[i]);
  printf("%lu", v1.size());
  for (int i : v1) printf(" %d", i);
  puts("");
  printf("%lu", v2.size());
  for (int i : v2) printf(" %d", i);
  puts("");
}
