#include <bits/stdc++.h>
using namespace std;
int n, m, S, T, cc = 1, fa[20005][15], dep[20005], hd[20005 * 25],
                iter[20005 * 25], d[20005 * 25], ie[20005], iv[20005];
vector<int> G[20005];
struct E {
  int v, nxt, w;
} e[4004005];
map<int, int> mp[20005];
void add(int u, int v, int w) {
  e[++cc] = (E){v, hd[u], w};
  hd[u] = cc;
  e[++cc] = (E){u, hd[v], 0};
  hd[v] = cc;
}
bool bfs() {
  memset(d, 33, sizeof(d));
  d[S] = 0;
  queue<int> q;
  q.push(S);
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int i = hd[x]; i; i = e[i].nxt)
      if (e[i].w && d[e[i].v] > 1e7) {
        d[e[i].v] = d[x] + 1;
        q.push(e[i].v);
      }
  }
  return d[T] < 1e7;
}
int dfs(int x, int f) {
  if (!f || x == T) return f;
  int sf = 0;
  for (int &i = iter[x]; i; i = e[i].nxt)
    if (e[i].w && d[e[i].v] == d[x] + 1) {
      int ff = dfs(e[i].v, min(f, e[i].w));
      if (ff) {
        e[i].w -= ff;
        e[i ^ 1].w += ff;
        f -= ff;
        sf += ff;
      }
    }
  return sf;
}
int dinic() {
  int ans = 0;
  while (bfs()) {
    memcpy(iter, hd, sizeof(iter));
    int f;
    while (f = dfs(S, 1e7)) ans += f;
  }
  return ans;
}
int gt(int x, int y) { return x * 15 + y + 22000; }
void pre(int x, int p) {
  fa[x][0] = p;
  dep[x] = dep[p] + 1;
  add(gt(x, 0), T, 1);
  ie[mp[x][p]] = gt(x, 0);
  for (int i = 1; i <= 14; i++) {
    fa[x][i] = fa[fa[x][i - 1]][i - 1];
    add(gt(x, i), gt(x, i - 1), 1e7);
    add(gt(x, i), gt(fa[x][i - 1], i - 1), 1e7);
  }
  for (int i = 0; i < G[x].size(); i++)
    if (G[x][i] != p) pre(G[x][i], x);
}
int main() {
  scanf("%d%d", &n, &m);
  S = m + 1;
  T = m + 2;
  for (int i = 1, u, v; i < n; i++) {
    scanf("%d%d", &u, &v);
    mp[u][v] = mp[v][u] = i;
    G[u].push_back(v);
    G[v].push_back(u);
  }
  pre(1, 0);
  for (int i = 1, u, v; i <= m; i++) {
    scanf("%d%d", &u, &v);
    add(S, i, 1);
    iv[i] = i;
    if (dep[u] < dep[v]) swap(u, v);
    for (int j = 14; j >= 0; j--)
      if (dep[fa[u][j]] >= dep[v]) add(i, gt(u, j), 1e7), u = fa[u][j];
    if (u == v) continue;
    for (int j = 14; j >= 0; j--)
      if (fa[u][j] != fa[v][j])
        add(i, gt(u, j), 1e7), u = fa[u][j], add(i, gt(v, j), 1e7),
                               v = fa[v][j];
    add(i, gt(u, 0), 1e7);
    add(i, gt(v, 0), 1e7);
  }
  printf("%d\n", dinic());
  vector<int> a, b;
  for (int i = 1; i <= 2e4; i++)
    if (i <= m && d[iv[i]] > 1e7) a.push_back(i);
  for (int i = 1; i <= 2e4; i++)
    if (i <= n && d[ie[i]] < 1e7) b.push_back(i);
  printf("%d", a.size());
  for (int i = 0; i < a.size(); i++) printf(" %d", a[i]);
  puts("");
  printf("%d", b.size());
  for (int i = 0; i < b.size(); i++) printf(" %d", b[i]);
  puts("");
  return 0;
}
