#include <bits/stdc++.h>
using namespace std;
void RI() {}
template <typename... T>
void RI(int& head, T&... tail) {
  scanf("%d", &head);
  RI(tail...);
}
char s[50010];
map<string, vector<int>> app;
int solve(string a, string b) {
  if (!app.count(a) || !app.count(b)) return -1;
  if (((int)(app[a]).size()) > ((int)(app[b]).size())) swap(a, b);
  static map<pair<string, string>, int> memo;
  if (memo.count(make_pair(a, b))) return memo[make_pair(a, b)];
  int la = ((int)(a).size()), lb = ((int)(b).size());
  auto &va = app[a], &vb = app[b];
  int ans = 1e9;
  auto chk = [&](int i, int j) {
    int now = max(va[i] + la, vb[j] + lb) - min(va[i], vb[j]);
    ans = min(ans, now);
  };
  if (((int)(va).size()) >= 300) {
    for (int i = 0, j = 0; i < ((int)(va).size()); i++) {
      while (j < ((int)(vb).size()) && vb[j] < va[i]) {
        chk(i, j);
        j++;
      }
      if (j < ((int)(vb).size())) chk(i, j);
    }
  } else {
    for (int i = 0; i < int(((int)(va).size())); i++) {
      int j = lower_bound(begin(vb), end(vb), va[i]) - vb.begin();
      if (j < ((int)(vb).size())) chk(i, j);
      j--;
      if (j >= 0) chk(i, j);
    }
  }
  return memo[make_pair(a, b)] = ans;
}
int main() {
  int n = strlen(gets(s));
  for (int i = 0; i < int(n); i++) {
    string t;
    for (int j = 0; j < 4 && i + j < n; j++) {
      t += s[i + j];
      app[t].push_back(i);
    }
  }
  int q;
  RI(q);
  while (q--) {
    char a[10], b[10];
    scanf("%s%s", a, b);
    int ans = solve(a, b);
    printf("%d\n", ans);
  }
  return 0;
}
