#include <bits/stdc++.h>
using namespace std;
const int M = 2e6 + 5, N = 2e4 + 2, inf = 0x3f3f3f3f;
int head[M], cnt = 1, n, m, F[15][N], dep[M], nod, T;
int id_f[15][N], id_p[N], id_e[N];
bool vis[M];
int iter[M];
vector<int> G[N];
vector<int> id[N];
struct edge {
  int to, nxt, cap;
} e[M * 3];
inline void addedge(int u, int v, int cap) {
  e[++cnt] = (edge){v, head[u], cap}, head[u] = cnt;
  e[++cnt] = (edge){u, head[v], 0}, head[v] = cnt;
}
void dfs(int now) {
  for (int i = 0; i < G[now].size(); ++i)
    if (!dep[G[now][i]]) {
      int to = G[now][i];
      dep[to] = dep[now] + 1;
      F[0][to] = now;
      id_e[to] = id[now][i];
      dfs(to);
    }
}
inline int LCA(int u, int v) {
  if (dep[u] < dep[v]) swap(u, v);
  for (int i = 14; ~i; --i)
    if (dep[F[i][u]] >= dep[v]) u = F[i][u];
  if (u == v) return u;
  for (int i = 14; ~i; --i)
    if (F[i][u] != F[i][v]) u = F[i][u], v = F[i][v];
  return F[0][u];
}
void link(int u, int v, int x) {
  int w = 0;
  for (int i = 0; i < 14; ++i)
    if (dep[F[i][u]] >= dep[v])
      w = i;
    else
      break;
  addedge(x, id_f[w][u], inf);
  if (F[w][u] == v) return;
  int d = dep[F[w][u]] - dep[v];
  for (int i = 14; ~i; --i)
    if (d >> i & 1) u = F[i][u];
  addedge(x, id_f[w][u], inf);
}
queue<int> q;
void bfs() {
  dep[0] = 1;
  for (q.push(0); !q.empty();) {
    int u = q.front();
    q.pop();
    for (int i = head[u]; i; i = e[i].nxt)
      if (e[i].cap && !dep[e[i].to]) {
        dep[e[i].to] = dep[u] + 1;
        q.push(e[i].to);
      }
  }
}
int DFS(int u, int f) {
  if (u == T || !f) return f;
  for (int& i = iter[u]; i; i = e[i].nxt)
    if (e[i].cap && dep[e[i].to] > dep[u]) {
      int d = DFS(e[i].to, min(f, e[i].cap));
      if (d) {
        e[i].cap -= d, e[i ^ 1].cap += d;
        return d;
      }
    }
  return 0;
}
int dinic() {
  for (int flow = 0;;) {
    memset(dep, 0, (T + 2) << 2);
    bfs();
    if (!dep[T]) return flow;
    memcpy(iter, head, (T + 2) << 2);
    for (int f; f = DFS(0, inf); flow += f)
      ;
  }
}
void DfS(int u) {
  vis[u] = 1;
  for (int i = head[u]; i; i = e[i].nxt)
    if (e[i].cap && !vis[e[i].to]) DfS(e[i].to);
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for (int i = 1; i < n; ++i) {
    int u, v;
    cin >> u >> v;
    G[u].push_back(v), G[v].push_back(u);
    id[u].push_back(i), id[v].push_back(i);
  }
  dfs(dep[1] = 1);
  for (int i = 1; i <= n; ++i) id_f[0][i] = i;
  for (int i = n + 1; i <= n + m; ++i) id_p[i - n] = i;
  nod = n + m;
  for (int i = 1; i < 15; ++i)
    for (int j = 1; j <= n; ++j) {
      F[i][j] = F[i - 1][F[i - 1][j]];
      if (!F[i][j]) continue;
      id_f[i][j] = ++nod;
      addedge(nod, id_f[i - 1][j], inf);
      addedge(nod, id_f[i - 1][F[i - 1][j]], inf);
    }
  T = ++nod;
  for (int i = 1; i <= m; ++i) addedge(0, id_p[i], 1);
  for (int i = 2; i <= n; ++i) addedge(id_f[0][i], T, 1);
  for (int i = 1; i <= m; ++i) {
    int u, v;
    cin >> u >> v;
    int lca = LCA(u, v);
    link(u, lca, id_p[i]), link(v, lca, id_p[i]);
  }
  int ans = dinic();
  cout << ans << '\n';
  DfS(0);
  vector<int> vec;
  for (int i = 1; i <= m; ++i)
    if (!vis[id_p[i]]) vec.push_back(i);
  cout << vec.size();
  for (int i : vec) cout << ' ' << i;
  cout << '\n';
  vec.clear();
  for (int i = 2; i <= n; ++i)
    if (vis[id_f[0][i]]) vec.push_back(id_e[i]);
  cout << vec.size();
  for (int i : vec) cout << ' ' << i;
  cout << '\n';
  return 0;
}
