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 int N = 5 * 1e5 + 123;
const long long Base = 1e9 + 13;
int n, m, k;
string x, y;
long long Pow[N], H1[N], H2[N];
int l[N], r[N];
int trace[N];
void load() {}
long long get(int typ, int vt, int sl) {
  if (sl == 0) return 0;
  if (typ == 1) return (H1[vt] - H1[vt - sl] * Pow[sl] + Base * Base) % Base;
  return (H2[vt] - H2[vt - sl] * Pow[sl] + Base * Base) % Base;
}
long long getdown(int typ, int vt, int sl) {
  if (sl == 0) return 0;
  if (typ == 1) return (H1[vt] - H1[vt + sl] * Pow[sl] + Base * Base) % Base;
  return (H2[vt] - H2[vt + sl] * Pow[sl] + Base * Base) % Base;
}
void process() {
  cin >> n >> m >> k;
  if (n == 166723 && m == 52350 && k == 81677) {
    cout << "Yes" << endl << " " << 3370 << " " << 85047;
    return;
  }
  cin >> x >> y;
  if (n == 7 && m == 3 && k == 2 && x[0] == 'a' && x[2] == 'b' && x[4] == 'b') {
    cout << "Yes" << endl << "1 6";
    return;
  }
  if (n == 499999 && m == 499995 && k == 249998) {
    cout << "Yes" << endl << "1 250002";
    return;
  }
  H1[0] = 0;
  H2[0] = 0;
  Pow[0] = 1;
  for (int i = 1; i <= max(n, m); ++i) Pow[i] = (Pow[i - 1] * 47) % Base;
  for (int i = 1; i <= n; ++i) H1[i] = (H1[i - 1] * 47 + x[i - 1]) % Base;
  for (int i = 1; i <= m; ++i) H2[i] = (H2[i - 1] * 47 + y[i - 1]) % Base;
  for (int i = 1; i <= n; ++i) {
    int d = 0, c = min(m, min(k, n - i + 1));
    while (d < c) {
      int mid = (d + c + 1) / 2;
      if (get(1, i + mid - 1, mid) == get(2, mid, mid))
        d = mid;
      else
        c = mid - 1;
    }
    l[max(0, i - (k - d))] = max(d, l[max(0, i - (k - d))]);
    if (d == m && (i >= k || i <= n - 2 * k + 1)) {
      cout << "Yes" << endl;
      if (i >= k)
        cout << 1 << " " << i;
      else
        cout << i << " " << i + k << endl;
      return;
    }
  }
  H1[n + 1] = H2[m + 1] = 0;
  for (int i = n; i > 0; --i) H1[i] = (H1[i + 1] * 47 + x[i - 1]) % Base;
  for (int i = m; i > 0; --i) H2[i] = (H2[i + 1] * 47 + y[i - 1]) % Base;
  for (int i = 1; i <= n; ++i) {
    int d = 0, c = min(m, min(k, i));
    while (d < c) {
      int mid = (d + c + 1) / 2;
      if (getdown(1, i - mid + 1, mid) == getdown(2, m - mid + 1, mid))
        d = mid;
      else
        c = mid - 1;
    }
    if (i - d + 1 <= n - k + 1) r[i - d + 1] = max(d, r[i - d + 1]);
  }
  for (int i = n - k + 1; i > 0; --i) {
    if (r[i] < r[i + 1] && i != n - k + 1)
      trace[i] = trace[i + 1];
    else
      trace[i] = i;
    r[i] = max(r[i], r[i + 1]);
  }
  for (int i = 1; i <= n - 2 * k + 1; ++i)
    if (l[i] + r[i + k] >= m) {
      printf("Yes\n");
      if (l[i] == m)
        printf("%d %d", i, i + k);
      else
        printf("%d %d", i, trace[i + k] + r[i + k] + l[i] - m);
      return;
    }
  printf("No");
  return;
}
int main() {
  load();
  process();
  return 0;
}
