#include <bits/stdc++.h>
using namespace std;
void do_nothing() {}
const int SIZE = 26 * 26 * 26 * 26 * 4;
int encode(string s) {
  int res = 0;
  for (auto ic = s.rbegin(); ic != s.rend(); ++ic) {
    res *= 26;
    res += *ic - 'a';
  }
  res *= 4;
  res += s.length() - 1;
  return res;
}
string decode(int x) {
  int len = x % 4 + 1;
  x /= 4;
  string res;
  for (int(i) = 0; (i) < (len); (i)++) {
    res += x % 26 + 'a';
    x /= 26;
  }
  return res;
}
void solve() {
  string s;
  cin >> s;
  vector<vector<int> > inds(SIZE);
  for (int i = 0; i < (int)(s).size(); i++) {
    for (int l = (1); l < (int)(5); l++) {
      if (i + l > s.size()) break;
      string sub = s.substr(i, l);
      inds[encode(sub)].push_back(i);
    }
  }
  map<pair<int, int>, int> cache;
  int q;
  cin >> q;
  for (int(req) = 0; (req) < (q); (req)++) {
    string s1, s2;
    cin >> s1 >> s2;
    int e1 = encode(s1);
    int e2 = encode(s2);
    vector<int> *v1 = &inds[e1];
    vector<int> *v2 = &inds[e2];
    if (v1->size() > v2->size()) {
      swap(v1, v2);
      swap(s1, s2);
    }
    int mi;
    if (v1->size() > 1000 && cache.count(pair<int, int>(e1, e2))) {
      mi = cache[pair<int, int>(e1, e2)];
    } else {
      mi = s.size() + 1;
      for (int i : *v1) {
        auto it = upper_bound(v2->begin(), v2->end(), i);
        if (it != v2->end()) {
          int j = *it;
          int nlen = max(i + s1.size(), j + s2.size()) - i;
          mi = min(mi, nlen);
        }
        if (it != v2->begin()) {
          --it;
          int j = *it;
          int nlen = max(i + s1.size(), j + s2.size()) - j;
          mi = min(mi, nlen);
        }
      }
      if (mi == s.size() + 1) mi = -1;
    }
    cout << mi << "\n";
    if (v1->size() > 1000) cache[pair<int, int>(e1, e2)] = mi;
  }
}
int main() {
  solve();
  return 0;
}
