Jenya has recently acquired quite a useful tool — k-scissors for cutting strings. They are generally used for cutting out two non-intersecting substrings of length k from an arbitrary string s (its length should be at least 2·k in order to perform this operation) and concatenating them afterwards (preserving the initial order). For example, with the help of 2-scissors you can cut ab and de out of abcde and concatenate them into abde, but not ab and bc since they're intersecting.

It's a nice idea to test this tool before using it in practice. After looking through the papers, Jenya came up with two strings s and t. His question is whether it is possible to apply his scissors to string s such that the resulting concatenation contains t as a substring?

Input

The first line contains three integers n, m, k (2 ≤ m ≤ 2·k ≤ n ≤ 5·105) — length of s, length of t and the aforementioned scissors' parameter correspondingly.

The next two lines feature s and t consisting of lowercase latin letters.

Output

If there is no answer, print «No». 

Otherwise print «Yes» and two integers L and R denoting the indexes where cutted substrings start (1-indexed). If there are several possible answers, output any.

Examples

Input

7 4 3
baabaab
aaaa


Output

Yes
1 5


Input

6 3 2
cbcbcb
bcc


Output

Yes
2 5


Input

7 5 3
aabbaaa
aaaaa


Output

No

Note

In the first sample case you can cut out two substrings starting at 1 and 5. The resulting string baaaab contains aaaa as a substring.

In the second sample case the resulting string is bccb.
#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 5e5 + 7;
const long long MOD1 = 1e9 + 7;
const long long MOD2 = 1e9 + 9;
const long long BASE = 129;
long long n, m;
long long mod1(long long n) {
  n %= MOD1;
  if (n < 0) return n + MOD1;
  return n;
}
long long mod2(long long n) {
  n %= MOD2;
  if (n < 0) return n + MOD2;
  return n;
}
long long h1[MAXN], h2[MAXN];
long long pw1[MAXN], pw2[MAXN];
long long geth1(long long l, long long r) {
  return mod1(h1[r + 1] - h1[l] * pw1[r - l + 1]);
}
long long geth2(long long l, long long r) {
  return mod2(h2[r + 1] - h2[l] * pw2[r - l + 1]);
}
long long th1[MAXN], th2[MAXN];
bool check1(long long i, long long len) {
  return (geth1(i, i + len - 1) == th1[len] &&
          geth2(i, i + len - 1) == th2[len]);
}
bool check2(long long i, long long len) {
  return (geth1(i - len + 1, i) == mod1(th1[m] - th1[m - len] * pw1[len]) &&
          geth2(i - len + 1, i) == mod2(th2[m] - th2[m - len] * pw2[len]));
}
long long mxpref[MAXN], mxpost[MAXN];
long long mmax1(long long i, long long j) {
  if (i == -1) return j;
  if (j == -1) return i;
  if (mxpost[i] >= mxpost[j])
    return i;
  else
    return j;
}
long long tree1[MAXN * 4];
void build1(long long v, long long tl, long long tr) {
  if (tl == tr) {
    tree1[v] = tl;
    return;
  }
  long long tm = (tl + tr) / 2;
  build1(v * 2 + 1, tl, tm);
  build1(v * 2 + 2, tm + 1, tr);
  tree1[v] = mmax1(tree1[v * 2 + 1], tree1[v * 2 + 2]);
}
long long get1(long long v, long long tl, long long tr, long long l,
               long long r) {
  if (tr < l || r < tl) return -1;
  if (l <= tl && tr <= r) return tree1[v];
  long long tm = (tl + tr) / 2;
  return mmax1(get1(v * 2 + 1, tl, tm, l, r),
               get1(v * 2 + 2, tm + 1, tr, l, r));
}
long long find1(long long v, long long tl, long long tr, long long l,
                long long r, long long x) {
  if (tr < l || r < tl) return -1;
  if (mxpost[tree1[v]] < x) return -1;
  if (tl == tr) return tl;
  long long tm = (tl + tr) / 2;
  long long lres = find1(v * 2 + 1, tl, tm, l, r, x);
  if (lres != -1)
    return lres;
  else
    return find1(v * 2 + 2, tm + 1, tr, l, r, x);
}
long long mmax2(long long i, long long j) {
  if (i == -1) return j;
  if (j == -1) return i;
  if (mxpref[i] >= mxpref[j])
    return i;
  else
    return j;
}
long long tree2[MAXN * 4];
void build2(long long v, long long tl, long long tr) {
  if (tl == tr) {
    tree2[v] = tl;
    return;
  }
  long long tm = (tl + tr) / 2;
  build2(v * 2 + 1, tl, tm);
  build2(v * 2 + 2, tm + 1, tr);
  tree2[v] = mmax2(tree2[v * 2 + 1], tree2[v * 2 + 2]);
}
long long get2(long long v, long long tl, long long tr, long long l,
               long long r) {
  if (tr < l || r < tl) return -1;
  if (l <= tl && tr <= r) return tree2[v];
  long long tm = (tl + tr) / 2;
  return mmax2(get2(v * 2 + 1, tl, tm, l, r),
               get2(v * 2 + 2, tm + 1, tr, l, r));
}
long long find2(long long v, long long tl, long long tr, long long l,
                long long r, long long x) {
  if (tr < l || r < tl) return -1;
  if (mxpref[tree2[v]] < x) return -1;
  if (tl == tr) return tl;
  long long tm = (tl + tr) / 2;
  long long lres = find2(v * 2 + 1, tl, tm, l, r, x);
  if (lres != -1)
    return lres;
  else
    return find2(v * 2 + 2, tm + 1, tr, l, r, x);
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  pw1[0] = pw2[0] = 1;
  for (long long i = 1; i < MAXN; ++i) {
    pw1[i] = mod1(pw1[i - 1] * BASE);
    pw2[i] = mod2(pw2[i - 1] * BASE);
  }
  long long k;
  cin >> n >> m >> k;
  string s, t;
  cin >> s >> t;
  for (long long i = 0; i < n; ++i) {
    h1[i + 1] = mod1(h1[i] * BASE + s[i]);
    h2[i + 1] = mod2(h2[i] * BASE + s[i]);
  }
  for (long long i = 0; i < m; ++i) {
    th1[i + 1] = mod1(th1[i] * BASE + t[i]);
    th2[i + 1] = mod2(th2[i] * BASE + t[i]);
  }
  for (long long i = 0; i < n; ++i) {
    long long l = 0;
    long long r = min(n - i, m) + 1;
    while (l < r - 1) {
      long long mid = (l + r) / 2;
      if (check1(i, mid)) {
        l = mid;
      } else {
        r = mid;
      }
    }
    mxpref[i] = l;
    l = 0;
    r = min(i + 1, m) + 1;
    while (l < r - 1) {
      long long mid = (l + r) / 2;
      if (check2(i, mid)) {
        l = mid;
      } else {
        r = mid;
      }
    }
    mxpost[i] = l;
  }
  build1(0, 0, n - 1);
  build2(0, 0, n - 1);
  for (long long i = 1; i <= min(k, m - 1); ++i) {
    long long p1 = find2(0, 0, n - 1, k - i, n - 1, i);
    if (p1 == -1) continue;
    long long r1 = p1 + i - 1;
    long long ost = m - i;
    if (k < ost) continue;
    long long rt = k - ost;
    long long p2 = find1(0, 0, n - 1, r1 + ost, n - rt - 1, ost);
    if (p2 == -1) continue;
    cout << "Yes\n";
    cout << r1 - k + 2 << ' ' << p2 - ost + 2 << '\n';
    return 0;
  }
  if (m <= k) {
    for (long long i = 0; i + m - 1 < n; ++i) {
      if (geth1(i, i + m - 1) == th1[m] && geth2(i, i + m - 1) == th2[m]) {
        long long l2 = min(n - k, i);
        if (l2 >= k) {
          cout << "Yes\n";
          cout << "1 " << l2 + 1 << '\n';
          return 0;
        }
        long long r1 = max(k - 1, i + m - 1);
        if (n - r1 >= k) {
          cout << "Yes\n";
          cout << r1 - k + 2 << ' ' << r1 + 2 << '\n';
          return 0;
        }
      }
    }
  }
  cout << "No\n";
  return 0;
}
