#include <bits/stdc++.h>
using namespace std;
inline char gc() {
  static char now[1 << 16], *S, *T;
  if (S == T) {
    T = (S = now) + fread(now, 1, 1 << 16, stdin);
    if (S == T) return EOF;
  }
  return *S++;
}
inline int read() {
  int x = 0, f = 1;
  char c = gc();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = gc();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 3) + (x << 1) + c - 48;
    c = gc();
  }
  return x * f;
}
vector<int> con[20010], conid[20010];
vector<int>::iterator it;
int n, m, f[20010][15], dep[20010], lg[20010], id[20010][15], num, s = 0, t;
struct adj {
  int to, c, nxt;
} e[1260010];
int hd[320010], cnt = 1, cur[320010];
inline void addedge(int x, int y, int c) {
  e[++cnt] = (adj){y, c, hd[x]};
  hd[x] = cnt;
  e[++cnt] = (adj){x, 0, hd[y]};
  hd[y] = cnt;
}
int edge_id[20010];
void dfs(int x) {
  id[x][0] = ++num;
  for (int i = 1; i <= lg[dep[x] - 1]; ++i) {
    f[x][i] = f[f[x][i - 1]][i - 1];
    id[x][i] = ++num;
    addedge(num, id[x][i - 1], 0x3f3f3f3f);
    addedge(num, id[f[x][i - 1]][i - 1], 0x3f3f3f3f);
  }
  for (int i = 0; i < con[x].size(); ++i) {
    int y = con[x][i];
    if (y == f[x][0]) continue;
    f[y][0] = x;
    dep[y] = dep[x] + 1;
    edge_id[y] = conid[x][i];
    dfs(y);
  }
}
int d[320010], Q[320010], hed, til;
inline bool bfs() {
  for (int i = s; i <= t; ++i) d[i] = -1;
  int hed = 0, til = 1;
  d[s] = 1;
  Q[1] = s;
  while (hed < til) {
    int u = Q[++hed];
    for (int i = hd[u]; i; i = e[i].nxt) {
      int v = e[i].to;
      if (d[v] == -1 && e[i].c) {
        d[v] = d[u] + 1;
        Q[++til] = v;
      }
    }
  }
  return (d[t] != -1);
}
int dfs_flow(int u, int in) {
  if (u == t) return in;
  int out = 0;
  for (int &i = cur[u]; i; i = e[i].nxt) {
    int v = e[i].to;
    if (d[v] == d[u] + 1 && e[i].c) {
      int temp = dfs_flow(v, min(in, e[i].c));
      out += temp;
      in -= temp;
      e[i].c -= temp;
      e[i ^ 1].c += temp;
      if (!in) return out;
    }
  }
  if (in) d[u] = -1;
  return out;
}
bool vis[320010];
void dfs_way(int u) {
  vis[u] = 1;
  for (int i = hd[u]; i; i = e[i].nxt) {
    int v = e[i].to;
    if (!vis[v] && e[i].c) dfs_way(v);
  }
}
vector<int> ans1, ans2;
int main() {
  lg[1] = 0;
  for (int i = 2; i <= 20000; ++i) lg[i] = lg[i >> 1] + 1;
  n = read();
  m = read();
  num = m;
  for (int i = 1; i < n; ++i) {
    int x = read(), y = read();
    con[x].push_back(y);
    conid[x].push_back(i);
    con[y].push_back(x);
    conid[y].push_back(i);
  }
  for (int i = 1; i <= m; ++i) addedge(s, i, 1);
  dep[1] = 1;
  dfs(1);
  t = num + 1;
  for (int i = 2; i <= n; ++i) {
    addedge(id[i][0], t, 1);
  }
  for (int i = 1; i <= m; ++i) {
    int x = read(), y = read();
    if (dep[x] < dep[y]) swap(x, y);
    for (int j = 14; j >= 0; --j) {
      if (dep[f[x][j]] >= dep[y]) {
        addedge(i, id[x][j], 0x3f3f3f3f);
        x = f[x][j];
      }
    }
    if (x != y) {
      for (int j = 14; j >= 0; --j) {
        if (f[x][j] != f[y][j]) {
          addedge(i, id[x][j], 0x3f3f3f3f);
          addedge(i, id[y][j], 0x3f3f3f3f);
          x = f[x][j];
          y = f[y][j];
        }
      }
      addedge(i, id[x][0], 0x3f3f3f3f);
      addedge(i, id[y][0], 0x3f3f3f3f);
    }
  }
  int maxflow = 0;
  while (bfs()) {
    memcpy(cur, hd, sizeof(cur));
    maxflow += dfs_flow(s, 0x3f3f3f3f);
  }
  printf("%d\n", maxflow);
  dfs_way(s);
  for (int i = 1; i <= m; ++i)
    if (!vis[i]) ans1.push_back(i);
  for (int i = 2; i <= n; ++i)
    if (vis[id[i][0]]) ans2.push_back(edge_id[i]);
  printf("%d ", ans1.size());
  for (int i = 0; i < ans1.size(); ++i) printf("%d ", ans1[i]);
  puts("");
  printf("%d ", ans2.size());
  for (int i = 0; i < ans2.size(); ++i) printf("%d ", ans2[i]);
  puts("");
  return 0;
}
